我创建了一个应用程序,该应用程序是一个可运行的jar(使用maven-assembly插件),并带有几个用户可配置资源,它们位于同一目录(图像,属性,等等)运行Jar时的当前工作目录
当从命令行运行jar与java -jar ...
当前目录是你所期望的。问题是,在某些操作系统(Ubuntu 11.04)中,如果通过简单地双击该jar来启动应用程序,则当前工作目录是主目录。
是否有获取jar所在当前目录的首选方法,或者访问与jar并排放置的外部资源的其他方法?
我创建了一个应用程序,该应用程序是一个可运行的jar(使用maven-assembly插件),并带有几个用户可配置资源,它们位于同一目录(图像,属性,等等)运行Jar时的当前工作目录
当从命令行运行jar与java -jar ...
当前目录是你所期望的。问题是,在某些操作系统(Ubuntu 11.04)中,如果通过简单地双击该jar来启动应用程序,则当前工作目录是主目录。
是否有获取jar所在当前目录的首选方法,或者访问与jar并排放置的外部资源的其他方法?
您可以使用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"));
这里我试图发现从一个罐子运行所在目录。
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。
第一部分代码适用于jar,但是当我在eclipse中运行时(除非我移动文件),它会中断。不幸的是,将资源打包到jar中并不是一种选择,因为用户可能需要配置它们。 – job