我创建了一个应用程序,它是一个可运行的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所在的目录。