2011-06-22 12 views
8

He creado una aplicación que es un jar ejecutable (usando el complemento maven-assembly) con un par de recursos configurables por el usuario que se encuentran junto al mismo en el mismo directorio (imágenes, propiedades, etc.)Directorio de trabajo actual al ejecutar un Jar

Al ejecutar el jar desde la línea de comandos con java -jar ..., el directorio actual es el que se espera. El problema es que en algunos sistemas operativos (Ubuntu 11.04), si la aplicación se inicia simplemente haciendo doble clic en el contenedor, entonces el directorio de trabajo actual es el directorio de inicio.

¿Existe alguna forma de obtener el directorio actual en el que se encuentra el contenedor u otro método para acceder a los recursos externos que se encuentran junto al contenedor?

Respuesta

11

Puede usar MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath() para obtener la ubicación del archivo jar.

Otra alternativa sería empaquetar los otros recursos de solo lectura en su archivo jar junto con clases relacionadas para que pueda usar Class.getResource(String) o Class.getResourceAsStream(String) para obtener recursos relativos a la clase determinada.

Por ejemplo, podría tener una clase com.example.icons.Icons y los iconos serían empaquetados junto Icons.class en el/ejemplo/miaplicacion/iconos/ ruta com. Suponga que su botón de "abierta" utiliza un icono llamado open.png:

ImageIcon icon = new ImageIcon(Icons.getResource("open.png")); 
+0

El primer trozo de código funciona para el jar pero se rompe cuando corro desde eclipse (a menos que mueva los archivos). Desafortunadamente, empaquetar los recursos dentro del contenedor no es una opción porque el usuario puede necesitar configurarlos. – job

1

Aquí mi intento de descubrir el directorio desde donde se está ejecutando un frasco.

public class JarLocation { 
    public static void main(String[] args) { 
     new JarLocation().say(); 
    } 

    public void say() { 
     String className = this.getClass().getName().replace('.', '/'); 
     String classJar = 
      this.getClass().getResource("/" + className + ".class").toString(); 
     if (classJar.startsWith("jar:")) { 
      System.out.println("*** running from jar!"); 
     } 
     javax.swing.JOptionPane.showConfirmDialog((java.awt.Component) 
       null, classJar, "jar location", 
       javax.swing.JOptionPane.DEFAULT_OPTION); 
    } 
} 

Primero construyo el "camino" de la clase actual reemplazando el "." por "/", luego recupero .class como Recurso. El método toString() devuelve algo como:

jar:file:/C:/temp/testing.jar!/my/package/JarLocation.class 

A partir de ahí su análisis sintáctico de la cadena dada para recuperar el directorio en el que el frasco es.

Cuestiones relacionadas