2017-09-27 15 views
8

JRE-9/lib निर्देशिका (कम से कम विंडोज़ पर), modules नामक एक नई फ़ाइल है जिसका आकार लगभग 107 एमबी है। क्या उस फ़ाइल को निकालना संभव है या इसके भीतर जावा मॉड्यूल सूचीबद्ध कर सकते हैं?फ़ाइल jre-9/lib/मॉड्यूल को निकालने के लिए कैसे करें?

मैं देख सकता हूँ एक नया उपकरण कहा जाता है कि jmodjdk-9/bin/jmod.exe पर उपलब्ध है, लेकिन वह .jmod फ़ाइलें जो jdk-9/jmods पर स्थित है पढ़ने के लिए है और यह फ़ाइल modules नहीं पढ़ सकता।

उत्तर

6

modules फ़ाइल एक कंटेनर फ़ाइल है। यह जेडीके के लिए आंतरिक है और प्रारूप दस्तावेज नहीं है (यह किसी भी समय बदल सकता है)। समस्या निवारण उद्देश्यों के लिए, बिन निर्देशिका में jimage उपकरण सामग्री को सूचीबद्ध या निकालने के लिए उपयोग किया जा सकता है।

+1

'जिमेज' के किसी भी लिंक और इसका उपयोग कैसे किया जा सकता है, यह भी उपयोगी होगा। – nullpointer

+4

जिमेज के लिए कोई दस्तावेज़ पृष्ठ नहीं है लेकिन 'jimage --help' में पर्याप्त होना चाहिए। ध्यान दें कि टूल समस्या निवारण/समर्थन उपयोग के लिए शामिल है, यह ऐसा कुछ नहीं है जिसे अधिकांश डेवलपर्स की कभी आवश्यकता होगी। –

+0

मेरे लिए काम किया। बस $ Jimage $ JAVA_HOME/lib/मॉड्यूल 'निकालना और poof! – 0xbe5077ed

3

modules फ़ाइल एक एकल फाइल करने के लिए है (कहीं भी निकाला जा करने के लिए नहीं) मॉड्यूल सूचीबद्ध कर सकते हैं जो एक undocument प्रारूप में JDK में मौजूद मॉड्यूल के सभी की एक द्विआधारी प्रतिनिधित्व शामिल जो परिवर्तन के अधीन है। आप java --list-modules के साथ मॉड्यूल सूचीबद्ध कर सकते हैं।

प्रारंभ में modules फ़ाइल हर मॉड्यूल में शामिल होंगे और मूल रूप से अपने आप ही JDK के पक्ष दोगुना है, लेकिन एक बार आप अपने JDK jlink सुविधा का उपयोग "कम करें", modules फ़ाइल छोटे (यह मानते हुए अपने कार्यक्रम एक सबसेट होता है हो जाएगा जेडीके के साथ प्रदान किए गए मॉड्यूल का)। jlink पर अधिक जानकारी के लिए यहां देखें: http://openjdk.java.net/jeps/282

3

रनटाइम संसाधनों को पीछे के संगत तरीके से संभाला जाता है। जैसे जब आप अतीत में

URL url = Object.class.getResource("Object.class"); 
System.out.println(url); 

किया था, तो आप आमतौर पर जावा 9 के तहत एक ही चल रहा है की तरह

jar:file:/path-to-jre/lib/rt.jar!/java/lang/Object.class 

कुछ आप

jrt:/java.base/java/lang/Object.class 

बजाय दे देंगे मिला है। किसी भी मामले में, आप अन्य उपलब्ध संसाधनों (जावा 7 के बाद से) का निरीक्षण करने के लिए FileSystem खोल सकते हैं।

private static void readMyOwnJRE() throws IOException { 
    try { 
     Path p = Paths.get(URI.create("jrt:/modules")); 
     System.out.println("My own JRE's modules:"); 
     Files.list(p).forEach(System.out::println); 
     System.out.println(); 
    } catch(FileSystemNotFoundException ex) { 
     System.out.println("Could not read my modules (perhaps not Java 9?)."); 
    } 
} 

आप एक आप का निरीक्षण करना चाहते हैं की तुलना में अलग JRE के तहत चलाए जा रहे हैं, तो आप लोड करने के लिए है: एक ओर जहां ZipFileSystemFileSystems.newFileSystem पहले, जावा 9 के फाइल सिस्टम के माध्यम से बनाया जा सकता था यहां तक ​​कि पहले से ही उपयोग के लिए खुला है उचित फाइल सिस्टम कार्यान्वयन मैन्युअल पहले, लेकिन यह एक जावा 8 JRE से भी एक जावा 9 स्थापना निरीक्षण करने के लिए संभावना को खोलता है:

public static void readOtherJRE(Path pathToJRE) throws IOException { 
    Path p = pathToJRE.resolve("lib").resolve("jrt-fs.jar"); 
    if(Files.exists(p)) { 
     try(URLClassLoader loader = new URLClassLoader(new URL[]{ p.toUri().toURL() }); 
      FileSystem fs = FileSystems.newFileSystem(URI.create("jrt:/"), 
                 Collections.emptyMap(), 
                 loader)) { 
      System.out.println("Modules of "+pathToJRE); 
      Files.list(fs.getPath("/modules")).forEach(System.out::println); 
      System.out.println(); 
     } 
    } 
} 

एक बार जब आप एक फाइल सिस्टम (या इसे में एक Path) है, वाई कहां के सभी मानक कार्यों का उपयोग कर सकते हैं, उदा। Files डेटा का निरीक्षण या निकालने/प्रतिलिपि बनाने के लिए, हालांकि सही शब्द "एक समतुल्य फ़ाइल फ़ाइल को एक अलग फ़ाइल सिस्टम में संग्रहीत करने के लिए" होगा, क्योंकि रनटाइम छवि का प्रतिनिधित्व कक्षा फ़ाइल होना आवश्यक नहीं है।

0

आप इस फ़ाइल को पढ़ने के लिए jdk.internal.jimage.ImageReader का उपयोग कर सकते हैं।

संबंधित मुद्दे