В JEP 261: модульная система нет документации относительно формата, используемого файлами JMOD. Насколько я могу судить, это не упущение, поскольку оставление формата в качестве детали реализации означает, что они могут изменять формат без уведомления, когда захотят. Тем не менее, в настоящее время файлы JMOD, похоже, упакованы в формате ZIP; этот другой ответ цитирует следующее из JEP 261 :
Окончательный формат файлов JMOD является открытым вопросом, но на данный момент он основан на ZIP файлы.
Однако я не могу найти эту цитату нигде в JEP 261 . Это похоже на более старую версию спецификации - по крайней мере, я нашел похожую формулировку в истории JDK-8061972 (проблема, связанная с JEP).
Что это значит если вы должны - на данный момент - иметь возможность читать файл JMOD с помощью любого из API, которые позволяют читать файлы ZIP. Например, вы можете использовать одно из следующих:
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)
.
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, не задокументирован и может быть изменен без уведомления.