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

m3eecexj  于 2024-01-06  发布在  Maven
关注(0)|答案(1)|浏览(229)

我正在将java 9模块引入一个大项目,当我试图使用maven-jar-plugin构建一个可执行脚本(在其中一个子模块上)时,我遇到了一个问题。下面是我的项目的一个小视图:

  1. ├───my-sub-module
  2. ├───pom.xml
  3. └───src
  4. ├───main
  5. └───java
  6. ├───com
  7. └───packages
  8. └───...
  9. └───module-info.java (let's say the module name is com.foo.bar)
  10. │ └───test
  11. │ └───java
  12. │ └───com
  13. │ └───packages
  14. │ └───benchmark
  15. │ └───BenchmarkTests.java
  16. └───pom.xml

字符串
我的pom中的插件配置是:

  1. <build>
  2. <plugins>
  3. <!-- Build an executable test JAR -->
  4. <plugin>
  5. <groupId>org.apache.maven.plugins</groupId>
  6. <artifactId>maven-jar-plugin</artifactId>
  7. <configuration>
  8. <archive>
  9. <manifest>
  10. <addClasspath>true</addClasspath>
  11. <mainClass>com.packages.benchmark.BenchmarkTests</mainClass>
  12. </manifest>
  13. </archive>
  14. </configuration>
  15. <executions>
  16. <execution>
  17. <goals>
  18. <goal>test-jar</goal>
  19. </goals>
  20. </execution>
  21. </executions>
  22. </plugin>
  23. </plugins>
  24. </build>

EDIT当使用mvn clean install构建时,我得到了以下堆栈跟踪:

  1. Caused by: org.codehaus.plexus.archiver.ArchiverException: Could not create modular JAR file. The JDK jar tool exited with 1
  2. at org.codehaus.plexus.archiver.jar.JarToolModularJarArchiver.postCreateArchive (JarToolModularJarArchiver.java:123)
  3. at org.codehaus.plexus.archiver.AbstractArchiver.createArchive (AbstractArchiver.java:1066)
  4. at org.apache.maven.archiver.MavenArchiver.createArchive (MavenArchiver.java:676)
  5. at org.apache.maven.plugins.jar.AbstractJarMojo.createArchive (AbstractJarMojo.java:276)
  6. at org.apache.maven.plugins.jar.AbstractJarMojo.execute (AbstractJarMojo.java:307)
  7. at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137)
  8. at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210)
  9. at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
  10. at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
  11. at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
  12. at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
  13. at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
  14. at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
  15. at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
  16. at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
  17. at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
  18. at org.apache.maven.cli.MavenCli.execute (MavenCli.java:956)
  19. at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288)
  20. at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)
  21. at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
  22. at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
  23. at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
  24. at java.lang.reflect.Method.invoke (Method.java:566)
  25. at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
  26. at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
  27. at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
  28. at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)


我还注意到maven日志中的以下消息:

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


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

rkkpypqq

rkkpypqq1#

撇开@khmarbaise的许多优秀观点不谈:
错误:

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

字符串
.来自Plexus Archiver执行的jar --update操作,该操作将使项目的.jar文件成为模块化.jar文件。
Plexus Archiver传递给jar的标志之一是--main-class。由于Java虚拟机规范中的一行,作为此参数的值提供的类名必须是来自当前模块的类,即由所讨论的.jar文件根处的module-info.class文件描述的模块。可能出于多种原因,jar决定com.packages.benchmark.BenchmarkTests不属于当前模块。
错误消息的“ModulePackages class file attribute“部分显示是由于jar试图查看当前module-info.class类文件中有哪些已知软件包。该module-info.class文件的ModulePackages属性不包含com.package.benchmark
(The Plexus Archiver可能会在这里输出一个更好的错误消息,如果它检测到一个“坏”的META-INF/MANIFEST.MFMain-Class属性,甚至可以完全避免--update命令,因为它具有与jar工具相同的信息。参见https://github.com/codehaus-plexus/plexus-archiver/issues/310.

相关问题