validar ruta relativa proyectos proyecto obtener leer ejecuta donde direcciones aplicacion java deployment absolute-path

relativa - La ruta absoluta de la carpeta del proyecto en Java



url relativa java (3)

@ Mark es correcto. Ese es de lejos el enfoque más simple y más robusto.

Sin embargo, si realmente tiene que tener un File , entonces su mejor opción es probar lo siguiente:

  • convertir el contenido de la propiedad del sistema "java.class.path" en una lista de nombres de ruta,
  • identifique el nombre de ruta JAR en la lista en función de su nombre de archivo,
  • averiguar qué "../ .." es relativo al nombre de ruta JAR para darle el directorio "proyecto", y
  • construye tu camino objetivo en relación con el directorio del proyecto.

Otra alternativa es insertar el nombre del directorio del proyecto en una secuencia de comandos envoltorio y establecerlo como una propiedad del sistema utilizando una opción -D. También es posible hacer que una secuencia de comandos contenedora establezca su propia ruta de acceso absoluta; por ejemplo, usando de whence .

Mucha confusión en este tema. Varias preguntas han sido formuladas. Las cosas aún no parecen claras. ClassLoader, rutas absolutas de archivos, etc.

Supongamos que tengo una estructura de directorio de proyecto como,

MyProject-- --dist --lib --src --test

Tengo un recurso que dice "txtfile.txt" en el directorio "lib / txt". Quiero acceder a él de una manera independiente del sistema. Necesito la ruta absoluta del proyecto. Así que puedo codificar la ruta como abspath + "/ lib / Dictionary / txtfile.txt"

Supongamos que hago esto

java.io.File file = new java.io.File(""); //Dummy file String abspath=file.getAbsolutePath();

Obtengo el directorio de trabajo actual que no es necesariamente el proyecto raíz.

Supongamos que ejecuto el ''prj.jar'' final de la carpeta ''dist'' que también contiene el recurso y la estructura de directorios "lib / txt / txtfile.txt". También debería funcionar aquí. Debería ruta absoluta de la carpeta dist.

Espero que el problema esté claro.


Primero, asegúrese de que el directorio lib esté en su classpath. Puede hacer esto agregando el parámetro de línea de comando en su secuencia de comandos de inicio:

$JAVA_HOME/bin/java -classpath .:lib com.example.MyMainClass

guarde esto como MyProject / start.sh o cualquier script dependiente de os.

Luego puede acceder al archivo de texto.txt (como lo mencionó correctamente Mark) como:

// if you want this as a File URL res = getClass().getClassLoader().getResource("text/textfile.txt"); File f = new File(res.getFile()); // As InputStream InputStream in = getClass().getClassLoader() .getResourceAsStream("text/textfile.txt");


Realmente debería usar getResource () o getResourceAsStream () usando su cargador de clases para este tipo de cosas. En particular, estos métodos usan su ClassLoader para determinar el contexto de búsqueda de recursos dentro de su proyecto.

Especifique algo como getClass().getResource("lib/txtfile.txt") para recoger el archivo de texto.

Para aclarar: en lugar de pensar en cómo obtener el camino del recurso, debería pensar en obtener el recurso, en este caso, un archivo en un directorio en algún lugar (posiblemente dentro de su JAR). No es necesario conocer una ruta absoluta en este caso, solo una URL para acceder al archivo, y ClassLoader le devolverá esta URL. Si desea abrir una secuencia para el archivo, puede hacerlo directamente sin tener que usar una URL con getResourceAsStream .

Los recursos a los que intenta acceder a través de ClassLoader deben estar en Class-Path (configurado en el Manifiesto de su archivo JAR). Esto es crítico! ClassLoader utiliza Class-Path para encontrar los recursos, por lo que si no proporciona suficiente contexto en Class-Path, no podrá encontrar nada. Si agregas el ClassLoader debe resolver cualquier cosa dentro o fuera del JAR dependiendo de cómo se refiera al recurso, aunque ciertamente puede ser más específico.

En referencia al recurso con el prefijo a . hará que el Cargador de clases también busque archivos fuera del JAR, mientras que el prefijo de la ruta del recurso con un período dirigirá al Cargador de clases para que solo se vea dentro del archivo JAR.

Eso significa que si tienes algún archivo dentro del JAR en un directorio lib con el nombre foo.txt y quieres obtener el recurso, entonces ejecutarías getResource("lib/foo.txt");

Si el mismo recurso estuviera fuera del JAR, ejecutaría getResource("./lib/foo.txt");