运行Jar时的当前工作目录

时间:2011-06-22 00:13:00

标签: java jar

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

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

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

2 个答案:

答案 0 :(得分:11)

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

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

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

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

答案 1 :(得分:1)

这里我尝试发现运行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作为资源检索。 toString()方法返回类似于:

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

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