2017-09-27 7 views
8

JRE-9/lib 디렉토리에 (적어도 Windows에서는) modules이라는 새 파일이 있으며 크기는 약 107MB입니다. 해당 파일을 추출하거나 그 안에 Java 모듈을 나열 할 수 있습니까?jre-9/lib/modules 파일을 추출하는 방법은 무엇입니까?

나는 새로운 도구가 jmodjdk-9/bin/jmod.exe에서 확인할 수있다라는 것을 알 수 있습니다,하지만 jdk-9/jmods에 위치 .jmod 파일을 읽어이며 파일 modules를 읽을 수 없습니다.

undocument 형식으로 JDK에 존재하는 모든 모듈의 바이너리 표현을 포함

답변

6

modules 파일은 컨테이너 파일입니다. JDK의 내부이며 형식이 문서화되지 않았습니다 (언제든지 변경 될 수 있음). 문제 해결을 위해 bin 디렉토리에있는 jimage 도구를 사용하여 내용을 나열하거나 추출 할 수 있습니다.

+1

'jimage'에 대한 링크와 그 사용법이 유용 할 것입니다. – nullpointer

+4

jimage에 대한 문서 페이지가 없지만'jimage --help'에 충분해야합니다. 이 도구는 문제 해결/지원 용도로 포함되어 있지만 대부분의 개발자가 필요로하는 것은 아닙니다. –

+0

나를 위해 일했습니다. 그냥'$ jimage 추출물 $ JAVA_HOME/lib/modules'과 멍청한 짓! – 0xbe5077ed

1

당신은 modules 파일을 하나의 파일로 의미 java --list-modules

3

(어디 추출하는 것은 아닙니다)를 통해 모듈을 나열 할 수 있습니다 이는 변경 될 수 있습니다. 포함 된 모듈을 java --list-modules과 함께 나열 할 수 있습니다.

처음에 modules 파일은 모든 모듈을 포함하고 기본적으로 자신의 JDK의 측면을 두 배로,하지만 당신은 jlink 유틸리티를 사용하여 JDK를 "축소하세요"하면, modules 파일은 작은 (프로그램 일부를 포함하고 가정이 될 것입니다 JDK와 함께 제공되는 모듈). jlink에 대한 자세한 내용은 여기를 참조하십시오 : http://openjdk.java.net/jeps/282

3

런타임 자원은 역 호환 방식으로 처리됩니다. 예 : 과거에

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

을했을 때, 당신은 일반적으로 당신에게 대신

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

을 줄 것이다 자바 (9)에서 같은 실행

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

같은 것을 얻었다. 두 경우 모두 FileSystem을 열어 다른 사용 가능한 자원 (Java 7부터)을 검사 할 수 있습니다.

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)가되면, y를 모든 표준 기능을 사용할 수 있습니다. Files을 사용하면 데이터를 검사하거나 추출/복사 할 수 있지만 런타임 이미지의 표현이 클래스 파일 일 필요가 없으므로 올바른 용어는 다른 파일 시스템에 "동등한 클래스 파일을 저장하는"것입니다.

0

jdk.internal.jimage.ImageReader를 사용하여이 파일을 읽을 수 있습니다.