运行Jar时的当前工作目录



我创建了一个应用程序,它是一个可运行的jar(使用maven汇编插件),带有几个用户可配置的资源,这些资源位于同一目录中(图像、属性等)

当使用java -jar ...从命令行运行jar时,当前目录正如您所期望的那样。问题是,在一些操作系统(Ubuntu 11.04)上,如果只需双击jar即可启动应用程序,那么当前的工作目录就是主目录。

有没有一种首选的方法来获取jar所在的当前目录,或者另一种方法来访问jar旁边的外部资源?

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

另一种选择是将jarfile中的其他只读资源与相关类一起打包,这样您就可以使用Class.getResource(String)或Class.getResourceAsStream(String)来获取与给定类相关的资源。

例如,您可能有一个类com.example.icons.icons,这些图标将与icons.class一起打包在com/example/myapp/icons/路径中。假设您的"打开"按钮使用名为open.png:的图标

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

这里我试图发现运行jar的目录。

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作为Resource检索。toString()方法返回如下内容:

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

从那里解析给定的字符串以检索jar所在的目录。

最新更新