मैं एक फ़ोल्डर ट्री में सभी फ़ाइलों के लिए विहित रास्तों को हल करने की कोशिश कर रहा हूँ पर सिमलिंक का समाधान हो जाएगा नहीं है, लेकिन किसी कारण से यह उनके समाधान नहीं होगा (और रुक-रुक कर JVM सुरक्षा कोड के भीतर सिमलिंक ठीक से हल होगा फ़ाइल अनुमति और सुरक्षा त्रुटि का कारण बनता है)।जावा रुक-रुक कर लिनक्स
पर्यावरण:
$ 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
एक और परीक्षण, निम्नलिखित कोड का उपयोग कर, कभी कभी सच अनुमति जांच करने के लिए वापस आ जाएगी, लेकिन कभी कभी अवास्तविक लौटाते हैं:
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
लेकिन जब
(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
0123: डीबगिंग, अगर मैं लक्ष्य फ़ाइल पर FilePermission के सृजन के माध्यम कदम, आंतरिक पथ सिमलिंक करने के लिए उत्पादन परिणाम हल हो गई है, और समस्या
कि एप्लिकेशन जिसमें अनुमति वास्तव में जाँच जगह लेता है के संदर्भ में, सिमलिंक हमेशा FilePermission वस्तु द्वारा हल हो गई है है, लेकिन() file.getCanonicalPath को अपने खुद के कॉल से कभी नहीं के रूप में ऊपर का प्रदर्शन किया।
क्या यह किसी के लिए समझ में आता है?
आप एक बग रिपोर्ट दर्ज करना चाहेंगे; मैं अपने उबंटू 11.04 सिस्टम पर ओपनजेडके या सूरज जेडीके के साथ शुरुआती 'getCanonicalPath() 'समस्या का पुनरुत्पादन नहीं कर सकता। – sarnold
सरनोल्ड, क्या आप सटीक ओपनजेडीके संस्करण का उपयोग कर रहे हैं? आश्चर्य है कि शायद यह विशिष्ट रिलीज में एक मुद्दा है। इसके अलावा, मैंने अभी पाया है कि अगर मैं या तो -Dsun.io.useCanonCaches = false या -Dsun.io.useCanonPrefixCache = false सेट करता हूं तो मैं 100% समय को हल करने के लिए कैननिकल पथ प्राप्त कर सकता हूं लेकिन यह अजीब लगता है। – Ray
मुझे खेद है कि मैंने संस्करण संख्या शामिल नहीं की थी; 'जावा-वर्जन' रिपोर्ट 'ओपनजेडीके रनटाइम एनवायरनमेंट (आईसीएसटीए 661010) (6 बी 22-1.10.6-0ubuntu1) 'ओपनजेडीके 64-बिट सर्वर वीएम (बिल्ड 20.0-बी 11, मिश्रित मोड)'। – sarnold