0

Java アプリケーションを Mac OS X アプリ バンドルにコンパイルしようとしています。次の設定を追加して、現在の作業ディレクトリを設定します。

<bundleapp...>
    ...
    <option value="-Duser.dir=$APP_ROOT/Contents/Resources"/>
</bundleapp>

Contents/Resources/ に config ディレクトリがあります。

それを実行すると、次の奇妙な動作が発生します。

new File("config/").exists()false を返します

new File("config/").getAbsolutePath()/path/to/bundled/app/MyApp.app/Contents/Resources/config を返します

new File("config/").getAbsoluteFile().exists()true を返します

なぜこれが起こるのかわかりません。コードのどこにでも getAbsoluteFile() を追加したくないのです。

これについて何か考えはありますか?

(注: Oracle JDK 8 を使用しています)

4

1 に答える 1

1

getAbsolutePath現在のプロパティに対する相対パスを解決しuser.dirます。javadocsから:

UNIX システムでは、現在のユーザー ディレクトリに対して解決することにより、相対パス名が絶対パス名になります。

javadocsはそれを述べていますが

デフォルトでは、java.io パッケージのクラスは常に現在のユーザー ディレクトリに対して相対パス名を解決します。このディレクトリは、システム プロパティ user.dir によって名前が付けられ、通常は Java 仮想マシンが呼び出されたディレクトリです。

このバグ レポートでは、相対パスの「より単純な」getter (「絶対」ではない) は、仮想マシンが呼び出されたパスに対して解決されると記載されています。

于 2014-08-12T16:01:14.823 に答える