迁移到 java 9 模块时无法使用 maven-jar-plugin 构建可执行 jar

问题描述 投票:0回答:1

我正在向一个大项目引入 java 9 模块,并且在尝试使用 maven-jar-plugin 构建可执行 JAR(在其中一个子模块上)时遇到问题。 这是我的项目的一个小视图:

├───my-sub-module
│   ├───pom.xml
│   └───src
│       ├───main
│       │   └───java
│       │       ├───com
│       │       │   └───packages
│       │       │       └───...
│       │       │           
│       │       └───module-info.java (let's say the module name is com.foo.bar)
│       └───test
│           └───java
│               └───com
│                   └───packages
│                       └───benchmark
│                           └───BenchmarkTests.java
└───pom.xml

我的pom中的插件配置是:

<build>
        <plugins>
            <!-- Build an executable test JAR -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>com.packages.benchmark.BenchmarkTests</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>test-jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

编辑 使用

mvn clean install
构建时,我得到以下堆栈跟踪:

Caused by: org.codehaus.plexus.archiver.ArchiverException: Could not create modular JAR file. The JDK jar tool exited with 1
    at org.codehaus.plexus.archiver.jar.JarToolModularJarArchiver.postCreateArchive (JarToolModularJarArchiver.java:123)
    at org.codehaus.plexus.archiver.AbstractArchiver.createArchive (AbstractArchiver.java:1066)
    at org.apache.maven.archiver.MavenArchiver.createArchive (MavenArchiver.java:676)
    at org.apache.maven.plugins.jar.AbstractJarMojo.createArchive (AbstractJarMojo.java:276)
    at org.apache.maven.plugins.jar.AbstractJarMojo.execute (AbstractJarMojo.java:307)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
    at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
    at org.apache.maven.cli.MavenCli.execute (MavenCli.java:956)
    at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288)
    at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:566)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)

我还注意到 Maven 日志中存在以下消息:

jar: Package com.package.benchmark missing from ModulePackages class file attribute

这是否意味着我的测试包应该与模块包中的名称相同?

maven java-9 java-module maven-jar-plugin
1个回答
0
投票

抛开@khmarbaise 的许多精彩观点:

错误:

jar: Package com.package.benchmark missing from ModulePackages class file attribute

...来自 Plexus Archiver 执行的

jar --update
操作,以使项目的
.jar
文件成为模块化
.jar
文件。

Plexus Archiver 传递给

jar
的标志之一是
--main-class
。由于 Java 虚拟机规范 中的 行,作为此参数的值提供的类名必须是当前模块中的类,即由
module-info.class
根目录下的
.jar
文件描述的模块有问题的文件。也许出于多种原因,
jar
决定
com.packages.benchmark.BenchmarkTests
不属于当前模块。

错误消息的“

ModulePackages class file attribute
”部分是由于
jar
尝试查看当前
module-info.class
类文件中存在哪些已知包而显示的。该
ModulePackages
文件的
module-info.class
属性不包含
com.package.benchmark

(Plexus Archiver 可能会在此处输出更好的错误消息,如果检测到“坏”

--update
META-INF/MANIFEST.MF
属性,甚至可以完全避免使用
Main-Class
命令,因为它具有与
jar
工具所具有的所有相同信息. 请参阅https://github.com/codehaus-plexus/plexus-archiver/issues/310。

© www.soinside.com 2019 - 2024. All rights reserved.