有没有办法以编程方式读取 Java 中的 .jmod 文件?

Is there a way to read programmatically a .jmod file in Java?

我用 7-zip 打开了一个 .jmod 文件,我可以看到里面的内容。我尝试以编程方式使用 ZipInputStream 读取它,但它不起作用:有人知道该怎么做吗?

JEP 261: Module System regarding the format used by JMOD files. That's not an oversight, as far as I can tell, because leaving the format as an implementation detail means they can change the format, without notice, whenever they want. That being said, currently JMOD files appear to be packaged in the ZIP format; 中没有文档引用 JEP 261 中的以下内容:

The final format of JMOD files is an open issue, but for now it is based on ZIP files.

但是,我在 JEP 261 中的任何地方都找不到该引用。它看起来来自规范的旧版本——至少,我在 JDK-8061972(与 JEP 相关的问题)的历史记录中发现了类似的措辞。

这意味着您暂时应该能够使用任何允许读取 ZIP 文件的 API 来读取 JMOD 文件。例如,您可以使用以下之一:

  1. java.util.zip API:

    import java.io.File;
    import java.io.IOException;
    import java.util.zip.ZipFile;
    
    public class Main {
    
      public static void main(String[] args) throws IOException {
        var jmodFile = new File(args[0]).getAbsoluteFile();
        System.out.println("Listing entries in JMOD file: " + jmodFile);
    
        try (var zipFile = new ZipFile(jmodFile)) {
          for (var entries = zipFile.entries(); entries.hasMoreElements(); ) {
            System.out.println(entries.nextElement());
          }
        }
      }
    }
    

    注意:要阅读条目的内容,请参阅ZipFile#getInputStream(ZipEntry)

  2. ZIP FileSystemProvider API:

    import java.io.IOException;
    import java.nio.file.FileSystems;
    import java.nio.file.Files;
    import java.nio.file.Path;
    
    public class Main {
    
      public static void main(String[] args) throws IOException {
        var jmodFile = Path.of(args[0]).toAbsolutePath().normalize();
        System.out.println("Listing entries in JMOD file: " + jmodFile);
    
        try (var fileSystem = FileSystems.newFileSystem(jmodFile)) {
          Files.walk(fileSystem.getRootDirectories().iterator().next())
              .forEachOrdered(System.out::println);
        }
      }
    }
    

    注意:要读取条目的内容,请使用 java.nio.file.Files class.

    注意: Path#of(String,String...) method was added in Java 11 and the FileSystems#newFileSystem(Path)方法是在Java中添加的 13.如果使用,请替换那些方法调用Java.

  3. 的旧版本

但要重申:JMOD 文件使用的格式未记录,可能会更改,恕不另行通知。