如何将模块声明注入 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

当然,我可以创建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>

最新更新