Mac OS X上的Java System.getProperty(“user.dir”)

时间:2009-06-01 20:47:48

标签: java macos properties system

我在桌面上的Mac OS X 10.4上有一个应用程序包。我的应用程序查找名为“resources”的文件夹,其中保存要显示的文件(与可运行的JAR保持在同一位置)。我知道应用程序包中还有一个名为“Resources”的文件夹,对不起,如果那令人困惑,但我从来没有在Mac上编程,也不知道这将是同一个名字。

在Windows中,当我调用System.getProperty("user.dir")时,我获得了可运行的JAR文件所在的位置。正是我想要的。

为什么然后当我运行应用程序包时,getProperty返回“/”?就这样。我希望它返回类似“/Users/user_name/Desktop”......这是我的应用程序包所在的位置。

2 个答案:

答案 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文件调用的可执行文件。我总是可以将应用程序显示的文件放在用户主页上,因为该位置将始终返回路径。