Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mac OS X上的Java System.getProperty(“user.dir”)_Java_Macos_Properties_System - Fatal编程技术网

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

Mac OS X上的Java System.getProperty(“user.dir”),java,macos,properties,system,Java,Macos,Properties,System,我在Mac OS X 10.4的桌面上有一个应用程序包。我的应用程序查找一个名为“resources”的文件夹,其中保存了要显示的文件(保存在与可运行JAR相同的位置)。我知道在应用程序包中也有一个名为“Resources”的文件夹,如果这让人困惑的话,很抱歉,但我从来没有在Mac上编程过,也不知道这会是同一个名称 在Windows中,当我调用System.getProperty(“user.dir”)时,我会得到可运行JAR文件所在的位置。正是我想要的 为什么在运行应用程序包时getPrope

我在Mac OS X 10.4的桌面上有一个应用程序包。我的应用程序查找一个名为“resources”的文件夹,其中保存了要显示的文件(保存在与可运行JAR相同的位置)。我知道在应用程序包中也有一个名为“Resources”的文件夹,如果这让人困惑的话,很抱歉,但我从来没有在Mac上编程过,也不知道这会是同一个名称

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

为什么在运行应用程序包时getProperty返回“/”?就这些。我希望它返回“/Users/user\u name/Desktop”之类的内容,这就是我的应用程序包所在的位置

这是因为“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;
    }

自Java1以来,它在Windows下为所有Java版本可靠地工作了多年。

我使用了系统属性“user.home”而不是“user.dir”。这样,我就不必担心JVM在哪里。我让应用程序包直接引用我的jar文件,使用bash脚本作为info.plist文件调用的可执行文件。我始终可以将应用程序显示的文件放在用户主页上,因为该位置将始终返回路径。

感谢您的回复。我如何在OSX中看到JVM的运行来源?我不是Mac用户,当然有两件事是分开的,JVM可执行文件的位置(这应该不重要),它正在运行的principle JAR的位置——后者是我的代码地址。是的,JVM exe位于:System/Library/Frameworks/JavaVM.framework/Versions/Current不确定此代码是否适用,但这是一个开始。JAR是否位于应用程序包(即*.App文件夹)内?您是否通过单击应用程序图标来执行jar?OSX使用Jar启动程序加载Jar。这可能会混淆父工作目录。我尝试在mac和linux上使用user.home,但它要么不返回任何内容,要么得到一个?