【问题标题】:Java System.getProperty("user.dir") on Mac OS XMac OS X 上的 Java System.getProperty("user.dir")
【发布时间】:2009-06-01 20:47:48
【问题描述】:

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

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

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

【问题讨论】:

  • jar 是否位于 App 包内(即 *.app 文件夹)?您是否通过单击应用程序图标来执行 jar? OS X 使用 Jar Launcher 程序加载 jar。这可能会混淆父工作目录。

标签: java macos properties system


【解决方案1】:

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

【讨论】:

  • 我尝试在 mac 和 linux 上使用 user.home,但它要么不返回任何内容,要么我得到一个?
【解决方案2】:

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

多年来,它在 Windows 下对于自 Java 1 以来的所有 Java 版本都可靠地工作。

【讨论】:

  • 感谢您的回复。如何在 OSX 中查看 JVM 的运行位置?我不是 Mac 用户。
  • 当然还有两个独立的东西,JVM 可执行文件的位置(应该不关心),以及它正在运行的主要 JAR 的位置 - 后者是我的代码地址。
  • 是的,JVM exe 位于:System/Library/Frameworks/JavaVM.framework/Versions/Current 不确定此代码是否适用,但它是一个开始。
猜你喜欢
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 2010-11-06
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
相关资源
最近更新 更多