Un consejo de uso limitado, ya que se basa en el directorio de trabajo como raíz de maven. E incluso entonces, debería usarlo target/classes/abc.txtpara hacer referencia al archivo, ya que este es el lugar canónico donde Maven coloca los archivos de recursos después del procesamiento (por ejemplo, el complemento maven-resources podría haber realizado una sustitución de propiedades en abc.txt). Es mucho mejor usar abc.txt a través de getResource () desde classpath.
Gyro Gearless
2
¿Qué sucede si un usuario final ejecuta su aplicación como un JAR ejecutable? Entonces no habrá ningún archivo físico. Esta es otra razón por la que debería utilizar getResource () y, por ejemplo, abrir el flujo de entrada en función de lo que desee hacer con él.
Matthew Wise
6
¿Se puede eliminar esto como la respuesta correcta? @Karol S respondió a continuación: esa debería ser la respuesta correcta (de ahí la discrepancia de
votos a favor
3
Respuesta incorrecta. Consulte a continuación la respuesta de @Karol
No importa ahora dónde esté físicamente el archivo en la ruta de clase, se encontrará siempre que el recurso sea en realidad un archivo y no una entrada JAR.
(¡Lo aparentemente obvio new File(resource.getPath())no funciona para todas las rutas! ¡La ruta todavía está codificada en URL!)
Cree la instancia de classLoader de la clase que necesita, luego podrá acceder a los archivos o recursos fácilmente. ahora accedes a la ruta usando el getPath()método de esa clase.
Hay dos problemas en nuestro camino hacia la ruta absoluta:
La ubicación encontrada no será donde se encuentran los archivos de origen, sino donde se guarda la clase. Y la carpeta de recursos seguramente estará en algún lugar de la carpeta de origen del proyecto.
Las mismas funciones para recuperar el recurso funcionan de manera diferente si la clase se ejecuta en un complemento o en un paquete directamente en el espacio de trabajo.
El siguiente código nos dará todas las rutas útiles:
Aquí se investigan ambas funciones que se pueden utilizar para la localización de la carpeta de recursos. En cuanto a class, se puede obtener de cualquier manera, estática o dinámicamente.
Si el proyecto no está en el complemento, si se ejecuta el código en JUnit, se imprimirá:
Entonces, para llegar a src / rest / resources, debemos subir y bajar por el árbol de archivos. Se pueden utilizar ambos métodos. Tenga en cuenta que no podemos usar getResource(resourceFolderName), porque esa carpeta no está en la carpeta de destino. Nadie pone recursos en las carpetas creadas, espero.
Si la clase está en el paquete que está en el complemento, el resultado de la misma prueba será:
Aquí podemos obtener la ruta absoluta solo combinando los resultados de ambas funciones. Y no es suficiente. Entre ellos debemos poner la ruta local del lugar donde están los paquetes de clases, en relación con la carpeta del complemento. Probablemente, tendrá que insertar algo como srco src/test/resourceaquí.
Puedes insertar el código en el tuyo y ver las rutas que tienes.
Respuestas:
Puede utilizar el
ClassLoader.getResource
método para obtener el recurso correcto.URL res = getClass().getClassLoader().getResource("abc.txt"); File file = Paths.get(res.toURI()).toFile(); String absolutePath = file.getAbsolutePath();
O
Aunque esto puede no funcionar todo el tiempo, una solución más simple:
Puede crear un
File
objeto y usar elgetAbsolutePath
método:File file = new File("resources/abc.txt"); String absolutePath = file.getAbsolutePath();
fuente
target/classes/abc.txt
para hacer referencia al archivo, ya que este es el lugar canónico donde Maven coloca los archivos de recursos después del procesamiento (por ejemplo, el complemento maven-resources podría haber realizado una sustitución de propiedades en abc.txt). Es mucho mejor usar abc.txt a través de getResource () desde classpath.La forma correcta que realmente funciona:
URL resource = YourClass.class.getResource("abc"); Paths.get(resource.toURI()).toFile();
No importa ahora dónde esté físicamente el archivo en la ruta de clase, se encontrará siempre que el recurso sea en realidad un archivo y no una entrada JAR.
(¡Lo aparentemente obvio
new File(resource.getPath())
no funciona para todas las rutas! ¡La ruta todavía está codificada en URL!)fuente
new File(resource.toURI()).getAbsolutePath();
(es decir, ¿no creo que necesite el objeto Path?)new File(YourClass.class.getResource("abc").toURI().getPath())
si quisiera..getResource("/abc")
Necesita especificar la ruta comenzada desde
/
URL resource = YourClass.class.getResource("/abc"); Paths.get(resource.toURI()).toFile();
fuente
Cree la instancia de classLoader de la clase que necesita, luego podrá acceder a los archivos o recursos fácilmente. ahora accedes a la ruta usando el
getPath()
método de esa clase.ClassLoader classLoader = getClass().getClassLoader(); String path = classLoader.getResource("chromedriver.exe").getPath(); System.out.println(path);
fuente
Para devolver un archivo o ruta de archivo
URL resource = YourClass.class.getResource("abc"); File file = Paths.get(resource.toURI()).toFile(); // return a file String filepath = Paths.get(resource.toURI()).toFile().getAbsolutePath(); // return file path
fuente
Hay dos problemas en nuestro camino hacia la ruta absoluta:
El siguiente código nos dará todas las rutas útiles:
URL localPackage = this.getClass().getResource(""); URL urlLoader = YourClassName.class.getProtectionDomain().getCodeSource().getLocation(); String localDir = localPackage.getPath(); String loaderDir = urlLoader.getPath(); System.out.printf("loaderDir = %s\n localDir = %s\n", loaderDir, localDir);
Aquí se investigan ambas funciones que se pueden utilizar para la localización de la carpeta de recursos. En cuanto a
class
, se puede obtener de cualquier manera, estática o dinámicamente.Si el proyecto no está en el complemento, si se ejecuta el código en JUnit, se imprimirá:
loaderDir = /C:.../ws/source.dir/target/test-classes/ localDir = /C:.../ws/source.dir/target/test-classes/package/
Entonces, para llegar a src / rest / resources, debemos subir y bajar por el árbol de archivos. Se pueden utilizar ambos métodos. Tenga en cuenta que no podemos usar
getResource(resourceFolderName)
, porque esa carpeta no está en la carpeta de destino. Nadie pone recursos en las carpetas creadas, espero.Si la clase está en el paquete que está en el complemento, el resultado de la misma prueba será:
loaderDir = /C:.../ws/plugin/bin/ localDir = /C:.../ws/plugin/bin/package/
Entonces, nuevamente debemos subir y bajar por el árbol de carpetas.
El más interesante es el caso cuando el paquete se inicia en el complemento. Como prueba del complemento JUnit, para nuestro ejemplo. La salida es:
loaderDir = /C:.../ws/plugin/ localDir = /package/
Aquí podemos obtener la ruta absoluta solo combinando los resultados de ambas funciones. Y no es suficiente. Entre ellos debemos poner la ruta local del lugar donde están los paquetes de clases, en relación con la carpeta del complemento. Probablemente, tendrá que insertar algo como
src
osrc/test/resource
aquí.Puedes insertar el código en el tuyo y ver las rutas que tienes.
fuente