フォルダー ツリー内のすべてのファイルの正規パスを解決しようとしていますが、何らかの理由で解決されません (断続的に、JVM セキュリティ コードが FilePermission 内のシンボリック リンクを適切に解決し、セキュリティ エラーが発生します)。
環境:
$ 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() を呼び出すことによって解決されることはありません。
これは誰にとっても意味がありますか?