私はフォルダツリー内のすべてのファイルの正規パスを解決しようとしていますが、何らかの理由でそれらを解決できません(断続的にJVMセキュリティコードがシンボリックリンクをFilePermissionとセキュリティエラーが発生します)。javaは断続的にLinux上のシンボリックリンクを解決しません
ENV:
$ java -version
java version "1.6.0_23"
OpenJDK Runtime Environment (IcedTea6 1.11pre) (6b23~pre11-0ubuntu1.11.10.2)
OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode)
システムにおける既知のシンボリックリンクが/usr/share/java/gnome-java-bridge.jarある:
$ ls -l /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar
lrwxrwxrwx 1 root root 50 2012-02-24 13:39 /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar -> ../../../../../../share/java/gnome-java-bridge.jar
次のコードは、この既知のシンボリックリンクを解決しなければなりません:
String symlinkedFilePath =
"/usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar";
File symlinkedFile = new File(symlinkedFilePath);
System.out.println(symlinkedFile.getAbsolutePath());
System.out.println(symlinkedFile.getCanonicalPath());
が、生成します。
/usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar
/usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar
次のコードを使用して、さらにテストは、時々、パーミッションチェックのためにtrueを返しますが、時にはfalseを返します:
String symlinkedFilePath =
"/usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar";
File symlinkedFile = new File(symlinkedFilePath);
FilePermission recursivePermission = new FilePermission(
symlinkedFile.getParentFile().getParent() + "/-", "read");
FilePermission filePermission = new FilePermission(
symlinkedFile.getAbsolutePath(), "read");
System.out.println(recursivePermission);
System.out.println(filePermission);
System.out.println(
"Can read symlink: " + recursivePermission.implies(filePermission));
典型的な結果は次のとおりです。
(java.io.FilePermission /usr/lib/jvm/java-6-openjdk/jre/lib/- read)
(java.io.FilePermission /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar read)
Can read symlink: true
しかしときデバッグでは、ターゲットファイルのFilePermissionの作成をステップ実行すると、内部的にパスがシンボリックリンクに解決され、出力結果は次のようになります。
(java.io.FilePermission /usr/lib/jvm/java-6-openjdk/jre/lib/- read)
(java.io.FilePermission /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar read)
Can read symlink: false
問題は、アクセスチェックが実際に実行されるアプリケーションのコンテキスト内で、シンボリックリンクは常にFilePermissionオブジェクトによって解決されますが、上記のように私自身がfile.getCanonicalPath()を呼び出すことは決してありません。
これは誰にとっても意味がありますか?
バグレポートを提出したい場合があります。 Ubuntu 11.04システムのopenjdkまたはsun jdkの初期getCanonicalPath()問題を再現できません。 – sarnold
sarnold、正確なOpenJDKのバージョンを使用していますか?おそらくそれが特定のリリースで問題になっているのだろうかと思います。さらに、-Dsun.io.useCanonCaches = falseまたは-Dsun.io.useCanonPrefixCache = falseを設定した場合、標準パスを取得して100%の時間を解決できることが判明しましたが、それは奇妙に見えます。 – Ray
申し訳ありませんが、バージョン番号を含めるとは思いませんでした。 'java -version'は' OpenJDKランタイム環境(IcedTea6 1.10.6)(6b22-1.10.6-0ubuntu1) '' OpenJDK 64ビットサーバVM(ビルド20.0-b11、混合モード) 'を報告します。 – sarnold