>假设我有一些库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
或者,要编译生成的module-info.java
,您还需要将 JAR 的内容提取到目录中。
然后编译module-info.java
,并将输出目录 (-d( 设置为提取内容的目录。
学分 :- 艾伦
如果您使用的是 Maven 并且原始库在那里可用,则可以使用 moditect 插件的add-module-info
目标。下面是一个pom片段.xml我用来修补h2 jdbc驱动程序和引擎。该插件在${project.build.directory}/modules
中创建插件的修补副本,然后可以使用该副本,例如jlinking。
<plugin>
<groupId>org.moditect</groupId>
<artifactId>moditect-maven-plugin</artifactId>
<version>1.0.0.RC2</version>
<executions>
<execution>
<id>add-module-infos</id>
<phase>generate-resources</phase>
<goals>
<goal>add-module-info</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/modules</outputDirectory>
<modules>
<module>
<artifact>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.1.214</version>
</artifact>
<moduleInfoSource>
module com.h2database {
requires java.compiler;
requires jdk.net;
requires static lucene.core;
requires static lucene.queryparser;
requires static slf4j.api;
requires static jakarta.servlet;
requires transitive java.desktop;
requires transitive java.instrument;
requires java.logging;
requires transitive java.management;
requires static java.naming;
requires transitive java.scripting;
requires java.sql;
requires transitive java.transaction.xa;
requires transitive java.xml;
requires static javax.servlet.api;
requires static org.locationtech.jts;
requires static org.osgi.service.jdbc;
requires static osgi.core;
provides java.sql.Driver with org.h2.Driver;
}
</moduleInfoSource>
</module>
</modules>
</configuration>
</execution>
</executions>
</plugin>