2010-10-27 20 views
29

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 de Java en tiempo de ejecución a través de:¿Cómo obtener la ruta real de la aplicación Java en tiempo de ejecución?

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

pero en el contexto de una aplicación Java normal, lo podemos utilizar?

Respuesta

34

Probar;

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

También hay 'System.getProperty (" user.dir ")', que no puede arrojar una 'IOException'. – Jonathan

+3

¿Esto realmente devuelve el directorio donde está instalada la aplicación? Parece que debería devolver el directorio de trabajo, que no es necesariamente lo mismo. –

+0

Probado esto y devuelve el directorio de trabajo, no el directorio de la aplicación. –

3

Si está hablando de una aplicación web, debe usar el 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.

+0

gracias por la respuesta. –

+0

pero aquí estoy usando una aplicación Java simple. –

+0

@SameekMishra Entonces, ¿por qué mencionaste una aplicación web? – EJP

2
new File(".").getAbsolutePath() 
+0

por supuesto. (15chrs) – Bozho

23

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

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

@Gary ¿Revisó la documentación antes de publicarla? Es el directorio de trabajo actual. 'user.home' es el directorio de inicio del usuario. – Jonathan

+0

@Jonathan Lo siento. Tienes razón y estoy equivocado. Demasiado café hoy! –

+1

Estoy votando esto. No recibí solución de mi problema de esta publicación, pero este código era lo que necesito para mi proyecto. (obteniendo la ruta de ejecución de la aplicación java y agregando la ruta a java.path -mi dll está siempre en esta ruta-) Gracias. – yuceel

1

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

Sun se tomó un gran esfuerzo 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.

-1

La expresión

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

le dará 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 de la interfaz

System.getProperty(propertyName); 

. Una lista de estas propiedades can be found here.

Esto le permitirá hacer referencia al directorio de usuarios actual, el directorio temporal y demás de forma independiente de la plataforma.

7

¿Y con respecto al uso de this.getClass().getProtectionDomain().getCodeSource().getLocation()?

0
/***************************************************************************** 
    * 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() 
+1

Este código arrojará una 'NullPointerException' si de alguna manera hay una 'URISyntaxException'. – EJP

+0

esto no arrojará NullPointerException –

1

Dado que la ruta de la aplicación de un JAR y una aplicación que se ejecuta desde el interior de un IDE difiere, escribí el siguiente código para volver constantemente el directorio actual correcta:

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 getProgramDirectory() y que debiera ser bueno de cualquier manera.

0

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

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

pto.getAbsolutePath()); 
Cuestiones relacionadas