我創建了一個應用程序,該應用程序是一個可運行的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