¿Cómo obtener la ruta real de la aplicación Java en tiempo de ejecución?

Estoy creando una aplicación Java donde estoy usando log4j. He proporcionado la ruta absoluta del archivo log4j de configuración y también una ruta absoluta del archivo de registro generado (donde se genera este archivo de registro). Puedo obtener la ruta absoluta de una aplicación web Java en tiempo de ejecución a través de:

String prefix = getServletContext().getRealPath("/"); 

pero en el contexto de una aplicación Java normal, ¿qué podemos usar?

Tratar;

 String path = new File(".").getCanonicalPath(); 

No está claro lo que estás pidiendo. No sé qué ‘con respecto a la aplicación web que estamos usando’ significa si getServletContext().getRealPath() no es la respuesta, sino:

  • El directorio de trabajo actual del usuario actual viene dado por System.getProperty("user.dir")
  • El directorio de inicio del usuario actual está dado por System.getProperty("user.home")
  • La ubicación del archivo JAR desde donde se cargó la clase actual viene dada por this.getClass().getProtectionDomain().getCodeSource().getLocation() .

¿Y qué hay de usar this.getClass().getProtectionDomain().getCodeSource().getLocation() ?

Si está hablando de una aplicación web, debe usar getRealPath desde un objeto ServletContext .

Ejemplo:

 public class MyServlet extends Servlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{ String webAppPath = getServletContext().getRealPath("/"); } } 

Espero que esto ayude.

 new File(".").getAbsolutePath() 

Es mejor guardar los archivos en un subdirectorio de usuario.home que en cualquier lugar de la aplicación. podría residir

Sun hizo un esfuerzo considerable para garantizar que los applets y las aplicaciones. lanzado con Java Web Start no puede determinar las aplicaciones. camino real Este cambio rompió muchas aplicaciones. No me sorprendería si los cambios se extienden a otras aplicaciones.

Como la ruta de la aplicación de un JAR y una aplicación que se ejecuta desde un IDE , escribí el siguiente código para devolver de forma consistente el directorio actual correcto:

 import java.io.File; import java.net.URISyntaxException; public class ProgramDirectoryUtilities { private static String getJarName() { return new File(ProgramDirectoryUtilities.class.getProtectionDomain() .getCodeSource() .getLocation() .getPath()) .getName(); } private static boolean runningFromJAR() { String jarName = getJarName(); return jarName.contains(".jar"); } public static String getProgramDirectory() { if (runningFromJAR()) { return getCurrentJARDirectory(); } else { return getCurrentProjectDirectory(); } } private static String getCurrentProjectDirectory() { return new File("").getAbsolutePath(); } private static String getCurrentJARDirectory() { try { return new File(ProgramDirectoryUtilities.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()).getParent(); } catch (URISyntaxException exception) { exception.printStackTrace(); } return null; } } 

Simplemente llame a getProgramDirectory() y debe ser bueno de cualquier manera.

 /***************************************************************************** * return application path * @return *****************************************************************************/ public static String getApplcatonPath(){ CodeSource codeSource = MainApp.class.getProtectionDomain().getCodeSource(); File rootPath = null; try { rootPath = new File(codeSource.getLocation().toURI().getPath()); } catch (URISyntaxException e) { // TODO Auto-generated catch block e.printStackTrace(); } return rootPath.getParentFile().getPath(); }//end of getApplcatonPath() 

Yo uso este método para obtener la ruta completa a jar o exe.

 File pto = new File(YourClass.class.getProtectionDomain().getCodeSource().getLocation().toURI()); pto.getAbsolutePath()); 

Si desea obtener la ruta real de la aplicación web java como Spring (Servlet), puede obtenerla del objeto Servlet Context que viene con su HttpServletRequest.

 @GetMapping("/") public String index(ModelMap m, HttpServletRequest request) { String realPath = request.getServletContext().getRealPath("/"); System.out.println(realPath); return "index"; } 

La expresion

 new File(".").getAbsolutePath(); 

obtendrá el directorio de trabajo actual asociado con la ejecución de JVM. Sin embargo, la JVM proporciona una gran cantidad de otras propiedades útiles a través del

 System.getProperty(propertyName); 

interfaz. Una lista de estas propiedades se puede encontrar aquí .

Esto le permitirá hacer referencia al directorio de usuarios actual, al directorio temporal, etc. de forma independiente de la plataforma.