Java 如何将模块声明注入JAR?

Java 如何将模块声明注入JAR?,java,java-9,java-module,module-info,Java,Java 9,Java Module,Module Info,假设我有一些库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 pack

假设我有一些库
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
失败,因为包
package1
package2
不存在:

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

当然,我可以使用虚拟类创建目录
package1
package2
,但是有更好的方法吗?

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

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

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

然后编译
模块info.java
,将输出目录(-d)设置为提取内容的目录


谢谢,我不知道这个方法。我接受了我自己的答案,因为我觉得我的方式稍微优雅一些。提取文件是一个额外的步骤,这有点不方便(特别是对于工具)。当我使用这个命令时,我仍然会得到错误:>javac module-info.java module info.java:4:error:package是空的或不存在:package1有任何想法说明它为什么对我不起作用吗?@TiagoSantos这个包在JAR中存在吗?是的,一切看起来都很好,我使用上面的nullpointer解决方案使其工作,我同意您的解决方案更优雅,唯一的问题是,我的.jars:/在两个不同的版本中尝试过,但无法使用ones@TiagoSantos您是否用实际的模块名替换了
lib
?对于任何试图用生成的模块信息更新遗留JAR的人,我要做的就是使用以下命令序列:
jdeps--generate module info
javac--patch module=/module info.java
jar uf-C module info.class