2009-06-01 25 views
0

デスクトップ上のMac OS X 10.4にアプリケーションバンドルがあります。私のアプリケーションは、表示されるファイルが保持される(実行可能なJARと同じ場所に保存される) "resources"という名前のフォルダを探します。私はアプリのバンドル内に "Resources"という名前のフォルダがあることを知っています。ごめんなさい、それは混乱していますが、私は決してMacでプログラミングしたことがなく、これは同じ名前であることを知りませんでした。Mac OS XのJava System.getProperty( "user.dir")

System.getProperty("user.dir") Windowsでは、実行可能なJARファイルの場所がわかります。まさに私が望んでいたもの。

なぜアプリケーションバンドルを実行すると、 "/"を返すgetPropertyがありますか?それで全部です。私はそれが "/Users/user_name/Desktop" ...のようなものを返すと期待していました。これは私のアプリケーションバンドルの場所です。

+0

JarファイルはAppバンドル内にありますか(つまり* .appフォルダ)?アプリケーションアイコンをクリックしてjarを実行していますか? OS Xは、Jar Launcherプログラムでjarファイルを読み込みます。これは親作業ディレクトリを難読化する可能性があります。 –

答えて

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; 
    } 

それは、すべてのバージョンのWindowsで年間の私のために確実に働いています

+0

返事をありがとう。 JVMがどこから実行されているのかをOSXでどのように確認できますか?私はMacユーザーではない。 –

+0

コードのおかげで、私はそれを試して、それが動作するかどうかを確認します。 –

+0

もちろん、実行可能なJVMの場所(問題ではない)と実行中の原則JARの場所は2つに分かれています。後者は自分のコードが扱うものです。 –

1

代わりに、 "user.dir"ではなく "user.home"というシステムプロパティを使用しました。このようにして、私はJVMがどこを探しているのか心配する必要はありません。私は、アプリケーションバンドルrefernce私のjarファイルを直接実行可能なinfo.plistファイルによって呼び出されるbashスクリプトを使用している。私はいつも、その場所が常にパスを返すので、ユーザの家にアプリが表示するファイルを置くことができます。

+0

私はmacとlinux上でuser.homeを使用しようとしましたが、何も返されないか、または私は? – sttaq