我正在向一个大项目引入 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
这是否意味着我的测试包应该与模块包中的名称相同?
抛开@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。)