2011-06-22 37 views
8

我创建了一个应用程序,该应用程序是一个可运行的jar(使用maven-assembly插件),并带有几个用户可配置资源,它们位于同一目录(图像,属性,等等)运行Jar时的当前工作目录

当从命令行运行jar与java -jar ...当前目录是你所期望的。问题是,在某些操作系统(Ubuntu 11.04)中,如果通过简单地双击该jar来启动应用程序,则当前工作目录是主目录。

是否有获取jar所在当前目录的首选方法,或者访问与jar并排放置的外部资源的其他方法?

回答

11

您可以使用MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath()来获取jar文件的位置。

另一种替代方法是将其他只读资源打包在相关类中的jar文件中,以便您可以使用Class.getResource(String)Class.getResourceAsStream(String)获取与给定类相关的资源。

例如,你可能有一类com.example.icons.Icons和图标将在COM /例子/ MYAPP /图标/路径被打包一起Icons.class。假设你的“打开”按钮使用的图标命名open.png

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

第一部分代码适用于jar,但是当我在eclipse中运行时(除非我移动文件),它会中断。不幸的是,将资源打包到jar中并不是一种选择,因为用户可能需要配置它们。 – job

1

这里我试图发现从一个罐子运行所在目录。

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); 
    } 
} 

首先我通过替换“。”来构建当前类的“路径”。通过“/”,然后我检索.class作为资源。的toString()方法返回类似:

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

从那里您解析给定的字符串来检索目录中的jar。