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

2024-01-11

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


中没有文档JEP 261:模块系统 https://openjdk.java.net/jeps/261关于 JMOD 文件使用的格式。据我所知,这不是一个疏忽,因为将格式保留为实现细节意味着他们可以随时更改格式,恕不另行通知。话虽如此,目前 JMOD 文件似乎是以 ZIP 格式打包的;这个另一个答案 https://stackoverflow.com/a/44736159/6395627引用以下内容JEP 261:

JMOD 文件的最终格式是一个悬而未决的问题,但目前它基于 ZIP 文件。

但是,我在任何地方都找不到这句话JEP 261。它看起来来自该规范的旧版本 - 至少,我在历史中发现了类似的措辞JDK-8061972 https://bugs.openjdk.java.net/browse/JDK-8061972(与 JEP 相关的问题)。

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

  1. The java.util.zip https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/util/zip/package-summary.html 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());
          }
        }
      }
    }
    

    Note: To read the contents of an entry, see ZipFile#getInputStream(ZipEntry) https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/util/zip/ZipFile.html#getInputStream(java.util.zip.ZipEntry).

  2. The ZIP 文件系统提供程序 https://docs.oracle.com/en/java/javase/13/docs/api/jdk.zipfs/module-summary.html 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);
        }
      }
    }
    

    Note: To read the contents of an entry, use one of the many methods provided by the java.nio.file.Files https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/nio/file/Files.html class.

    Note: The Path#of(String,String...) https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/nio/file/Path.html#of(java.lang.String,java.lang.String...) method was added in Java 11 and the FileSystems#newFileSystem(Path) https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/nio/file/FileSystems.html#newFileSystem(java.nio.file.Path) method was added in Java 13. Replace those method calls if using an older version of Java.


不过,还是要重申一下:JMOD 文件使用的格式没有记录,并且可能会更改,恕不另行通知。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Java - 如何将特殊字符放入字符串中

    Java 似乎有很好的字符串处理能力 尽管如此 我还是遇到了最简单的问题 我需要动态字符串 它们在运行时更改 因此字符串类型不是一个好的选择 因为它们是不可变的 所以我使用字符数组 设置起来有点痛苦 但至少它们是可以修改的 我想创建一个字符
  • Hashmap并发问题

    我有一个哈希图 出于速度原因 我希望不需要锁定 假设我不介意过时的数据 同时更新它和访问它会导致任何问题吗 我的访问是获取 而不是迭代 删除是更新的一部分 是的 这会导致重大问题 一个例子是向散列映射添加值时可能发生的情况 这可能会导致表重
  • JavaFX 图像未在舞台中显示

    我尝试了很多次 尝试了很多方法 但都无法让自己的形象在舞台上如我所愿 我认为这可能与java寻找资源的路径有关 但我不确定 因为我刚刚开始使用视觉库 在本例中为JavaFX 这是我的目录结构 MyProject assets img myI
  • 在Java中使用命令行编译多个包

    您好 我一直在使用 IDE 但现在我需要从命令行运行和编译 问题是我有多个软件包 我试图找到答案 但没有任何效果 所以我有 src Support java files Me java files Wrapers java files 你知
  • 如何比较 Struts 2 中 url 请求参数中的单个字符

    我正在读取具有单个字符的 url 参数 它将是Y or N 我必须写一个条件来检查它是否Y or N并做相应的事情 这是我写的 但似乎不起作用 总是转到其他地方 网址是
  • Spring3/Hibernate3/TestNG:有些测试给出 LazyInitializationException,有些则没有

    前言 我在单元测试中遇到了 LazyInitializationException 的问题 而且我很难理解它 正如你从我的问题中看到的那样Spring 中的数据库会话 https stackoverflow com questions 13
  • 正则表达式获取字符串中的第一个数字和其他字符

    我是正则表达式的新手 想知道如何才能只获取字符串中的第一个数字 例如100 2011 10 20 14 28 55 在这种情况下 我希望它返回100 但该数字也可以更短或更长 我在想类似的事情 0 9 但它单独获取每个数字 100 2001
  • 是否有任何API可以将Microsoft Exchange服务器与Java应用程序集成以进行任务同步?

    我正在尝试将 Java Web 应用程序与 Microsoft Exchange 服务器集成以实现双向日历 即任务 同步 是否有用于此集成的 Java 开源 商业 API 谢谢 文卡特 看一眼j 交易所 http sourceforge n
  • Java Microsoft Excel API [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • JTable 和 JScrollpane 大小的问题

    我有一个JScrollPane with a JTable在里面 在里面JTable我最初有 3 行 稍后添加行 默认JTable我的 3 行很难看 因为JScrollPane calls getPreferredScrollableVie
  • 如何将 Observable>> 转换为 Observable>

    我陷入了如何将以下可观察类型转换 转换为我的目标类型的困境 我有以下类型的可观察值 Observable
  • 发生错误。请参阅日志文件 - eclipse juno

    每当我启动 Eclipse Juno 时 都会出现错误 发生错误 请查看日志文件 C Program Files eclipse configuration 1362989254411 log 有的网站说卸载jdk重新安装 我这样做了 但没
  • 如何在Java媒体框架中学习.wav持续时间?

    我正在尝试使用 java 媒体框架将 mov 文件与 wav 文件合并 因此我需要知道它们的持续时间 我怎样才能做到这一点 任何想法 将不胜感激 您可以使用以下方式了解声音文件的持续时间 即 VitalyVal 的第二种方式 import
  • 如何初始化静态地图?

    你会如何初始化静态Map在Java中 方法一 静态初始化方法二 实例初始化 匿名子类 或者 还有其他方法吗 各自的优点和缺点是什么 这是说明这两种方法的示例 import java util HashMap import java util
  • Java:由 HTTP 连接创建的等待连接线程存活时间很长

    我有一个服务器端代码 用于检查 SOAP 服务是否已启动 代码如下 String response while response length 0 try final URL url new URL DummySoapServiceURL
  • 使用 JAD 反编译 java - 限制

    我正在尝试使用 Java 中的 JAD 反编译几个 jar 文件 我也尝试过 JD GUI 但运气更差 但出现了很多错误 一种类型 易于修复 似乎是内部类 但我也发现了这段代码 static int SWITCH TABLE atp com
  • 警告:无法更改每个人的权限:

    当运行 Java 快速入门示例时https developers google com drive web quickstart java hl hu https developers google com drive web quicks
  • 为什么这个私人浮动字段变为零?

    我有一些奇怪的行为 我很难向自己解释 称为 textureScale 的浮点字段变为零 如果某些代码正在更改该值 则可以解释这一点 然而 我希望能够通过将其设置为 私有最终浮点 来导致构建失败 或者至少是运行时异常 那么无论更改该值都将失败
  • 为什么应该首选 Java 类的接口?

    PMD https pmd github io 将举报以下违规行为 ArrayList list new ArrayList 违规行为是 避免使用 ArrayList 等实现类型 而是使用接口 以下行将纠正违规行为 List list ne
  • Java、Spring、Hibernate找不到org.springframework.orm.hibernate3.LocalSessionFactoryBean

    我正在尝试制作 spring hibernate ant 项目 目前我收到此错误 HTTP Status 500 type Exception report message description The server encountere

随机推荐