我在桌面上的Mac OS X 10.4上有一个应用程序包。我的应用程序查找名为“resources”的文件夹,其中保存要显示的文件(与可运行的JAR保持在同一位置)。我知道应用程序包中还有一个名为“Resources”的文件夹,对不起,如果那令人困惑,但我从来没有在Mac上编程,也不知道这将是同一个名字。
在Windows中,当我调用System.getProperty("user.dir")
时,我获得了可运行的JAR文件所在的位置。正是我想要的。
为什么然后当我运行应用程序包时,getProperty返回“/”?就这样。我希望它返回类似“/Users/user_name/Desktop”......这是我的应用程序包所在的位置。
答案 0 :(得分:1)
那是因为“user.dir”表示当JVM运行时有效的当前用户目录;在Windows中,除非另行指定,否则这通常是JAR的位置。在OSX中,可能没有当前目录的概念,但更可能只是具有不同的默认值。
虽然我从未在OSX下专门测试过这段代码,但您可以尝试这样来找到加载任何类的目录:
static public File getClassLocation(Class cls, boolean trmjar) {
ClassLoader clsldr; // class loader
URL urlobj; // url object
String exturl; // external form of URL
String lwrurl; // lowercase external form of URL
File rtnfil; // return file
if((clsldr=cls.getClassLoader())==null) { clsldr=ClassLoader.getSystemClassLoader(); }
if((urlobj=clsldr.getResource(cls.getName().replace('.','/')+".class"))==null) {
return null;
}
exturl=urlobj.toExternalForm();
lwrurl=exturl.toLowerCase();
while(lwrurl.startsWith("jar:") || lwrurl.startsWith("file:/")) {
if(lwrurl.startsWith("jar:")) {
if(lwrurl.indexOf("!/")!=-1) { exturl=exturl.substring(4,(exturl.indexOf("!/"))); } // strip encapsulating "jar:" and "!/..." from JAR url
else { exturl=exturl.substring(4 ); } // strip encapsulating "jar:"
}
if(lwrurl.startsWith("file:/")) {
exturl=exturl.substring(6); // strip encapsulating "file:/"
if(!exturl.startsWith("/")) { exturl=("/"+exturl); }
while(exturl.length()>1 && exturl.charAt(1)=='/') { exturl=exturl.substring(1); }
}
lwrurl=exturl.toLowerCase();
}
exturl=java.net.URLDecoder.decode(exturl,"UTF-8");
rtnfil=new File(exturl);
if(lwrurl.endsWith(".class") || (trmjar && lwrurl.endsWith(".jar"))) { rtnfil=rtnfil.getParentFile(); }
if(rtnfil.exists()) { rtnfil=rtnfil.getAbsoluteFile(); }
return rtnfil;
}
自从Java 1以来,它在Windows下可靠地为我所有版本的Java工作。
答案 1 :(得分:1)
我改为使用系统属性“user.home”而不是“user.dir”。这样我就不必担心JVM的位置了。我有应用程序包直接使用bash脚本引用我的jar文件作为info.plist文件调用的可执行文件。我总是可以将应用程序显示的文件放在用户主页上,因为该位置将始终返回路径。