如何将模块声明注入 JAR?

How to inject module declaration into JAR?

假设我有一些我没有源代码的库 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,其中包含虚拟 类,但是有更好的方法吗?

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

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

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

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