Есть ли способ программно прочитать файл .jmod в Java? - PullRequest
0 голосов
/ 05 февраля 2020

Я открыл файл .jmod с 7-zip, и я могу видеть содержимое. Я пытался читать его с помощью ZipInputStream программно, но он не работает: кто-то знает, как это сделать?

1 Ответ

1 голос
/ 06 февраля 2020

В JEP 261: модульная система нет документации относительно формата, используемого файлами JMOD. Насколько я могу судить, это не упущение, поскольку оставление формата в качестве детали реализации означает, что они могут изменять формат без уведомления, когда захотят. Тем не менее, в настоящее время файлы JMOD, похоже, упакованы в формате ZIP; этот другой ответ цитирует следующее из JEP 261 :

Окончательный формат файлов JMOD является открытым вопросом, но на данный момент он основан на ZIP файлы.

Однако я не могу найти эту цитату нигде в JEP 261 . Это похоже на более старую версию спецификации - по крайней мере, я нашел похожую формулировку в истории JDK-8061972 (проблема, связанная с JEP).

Что это значит если вы должны - на данный момент - иметь возможность читать файл JMOD с помощью любого из API, которые позволяют читать файлы ZIP. Например, вы можете использовать одно из следующих:

  1. API java.util.zip:

    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 класс.

    Примечание: В Java был добавлен метод Path#of(String,String...). 11 и метод FileSystems#newFileSystem(Path) был добавлен в Java 13. Замените эти вызовы методов, если используете более старую версию Java.


Повторим, однако: Формат, используемый файлами JMOD, не задокументирован и может быть изменен без уведомления.

...