【问题标题】:How to inject module declaration into JAR?如何将模块声明注入 JAR?
【发布时间】:2017-11-10 11:54:20
【问题描述】:

假设我有一些库lib.jar,我没有源代码(或者它是用一些不知道模块的非Java 语言编写的)。 lib.jar 没有module-info.class 并且我不想将其用作自动模块,因此我想将module-info.class 注入其中。

我首先使用以下命令生成module-info.java

jdeps --generate-module-info . lib.jar

假设这产生了类似的东西:

module lib {
    exports package1;
    exports package2;
}

然后我尝试编译它,但 javac 失败,因为包 package1package2 不存在:

> javac module-info.java
module-info.java:4: error: package is empty or does not exist: package1

当然,我可以创建目录package1package2,其中包含虚拟类,但有更好的方法吗?

【问题讨论】:

    标签: java java-9 java-module module-info


    【解决方案1】:

    是的,这可以通过--patch-module 选项实现。这个选项最常在运行时使用,但它也适用于编译时:

    javac --patch-module <module name>=<path to jar> module-info.java
    

    【讨论】:

    • 当我使用这个命令时,我仍然得到错误:> javac module-info.java module-info.java:4: error: package is empty or does not exist: package1 知道为什么可能不适合我?
    • @TiagoSantos 包是否存在于 JAR 中?
    • 是的,一切似乎都很好,我设法使用上面的 nullpointer 解决方案让它工作,我同意你的解决方案更优雅,唯一的问题是它不适用于我的 .jars :/ 尝试了 2 个不同的
    • 对于任何尝试使用生成的模块信息更新旧版 JAR 的人,我必须执行以下命令序列:jdeps --generate-module-info . &lt;jar_path&gt;javac --patch-module &lt;module_name&gt;=&lt;jar_path&gt; &lt;module_name&gt;/module-info.javajar uf &lt;jar_path&gt; -C &lt;module_name&gt; module-info.class
    • Philip 的添加很重要,因为答案中的命令不会注入任何内容,只会将 module-info.java 编译为 jar 的 module-info.class。然后使用 jar 命令将该类添加到 jar 中。
    【解决方案2】:

    或者,要编译生成的module-info.java,您还需要将 JAR 的内容提取到一个目录中。

    然后编译 module-info.java 并将输出目录 (-d) 设置为您提取内容的目录。

    Credits :- Alan

    【讨论】:

    • 我接受了自己的答案,因为我认为我的方式稍微优雅一些​​。提取文件是一个额外的步骤,有点不方便(特别是对于工具)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    相关资源
    最近更新 更多