【问题标题】:RuntimeException during maven build of Java 9 spring boot applicationJava 9 Spring Boot 应用程序的 Maven 构建期间的 RuntimeException
【发布时间】:2018-03-26 10:19:53
【问题描述】:

我正在构建的 Java 9 应用程序可以从 IntelliJ IDE 编译并运行良好。在 IDE 上,我尝试将 Spring Boot 应用程序和普通应用程序配置为两者,并且两种配置都运行良好。

在执行 maven 构建时,我遇到了 RuntimeException 和下面的堆栈跟踪。

Caused by: java.lang.RuntimeException
    at org.springframework.asm.ClassVisitor.visitModule(ClassVisitor.java:148)
    at org.springframework.asm.ClassReader.readModule(ClassReader.java:762)
    at org.springframework.asm.ClassReader.accept(ClassReader.java:663)
    at org.springframework.asm.ClassReader.accept(ClassReader.java:527)
    at org.springframework.boot.loader.tools.MainClassFinder.createClassDescriptor(MainClassFinder.java:267)
    at org.springframework.boot.loader.tools.MainClassFinder.doWithMainClasses(MainClassFinder.java:223)
    at org.springframework.boot.loader.tools.MainClassFinder.findSingleMainClass(MainClassFinder.java:203)
    at org.springframework.boot.loader.tools.Repackager.findMainMethod(Repackager.java:365)
    at org.springframework.boot.loader.tools.Repackager.findMainMethodWithTimeoutWarning(Repackager.java:354)
    at org.springframework.boot.loader.tools.Repackager.buildManifest(Repackager.java:325)
    at org.springframework.boot.loader.tools.Repackager.repackage(Repackager.java:255)
    at org.springframework.boot.loader.tools.Repackager.repackage(Repackager.java:248)
    at org.springframework.boot.loader.tools.Repackager.repackage(Repackager.java:193)
    at org.springframework.boot.maven.RepackageMojo.repackage(RepackageMojo.java:221)
    at org.springframework.boot.maven.RepackageMojo.execute(RepackageMojo.java:208)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
    ... 22 more

经分析,这是由于提供的 ASM api 级别引起的。直接执行是 org.springframework.asm.Opcodes#ASM6,但是使用 maven build 时是 Opcodes#ASM4 导致问题。

进一步分析表明,实例创建如下 - Maven 构建 - https://github.com/spring-projects/spring-boot/blob/d3c34ee3d1bfd3db4a98678c524e145ef9bca51c/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/MainClassFinder.java#L301

IDE 执行 - https://github.com/spring-projects/spring-framework/blob/43b5e21947f3ad9682ae39cd8b8b5ae4b8f72c14/spring-core/src/main/java/org/springframework/core/type/classreading/ClassMetadataReadingVisitor.java#L71

如果我需要将此问题报告为 Spring Framework 的问题或是否存在任何解决方法,请告诉我。

Maven 版本:3.5.0

Spring Boot:2.0.0.M5

它是一个模块化构建,POM 文件在这里:https://gist.github.com/techpavan/faa81d46321004cd50e7403b03d70a2e

这里有一个更简单的复制器 - https://github.com/techpavan/java9-maven-spring-boot

使用此复制器,您会发现 maven 构建很容易失败。但是当在 org.springframework.asm.ClassVisitor > line 78 (Constructor) 处下断点并在执行期间将 api 值更新为 393216 (ASM6) 时,您会发现构建成功完成。默认情况下,该值设置为 262144 (ASM4),但在第 147 行失败。

更新:该问题已被 Spring 社区接受为错误,应在 Milestone 6 版本中修复 - https://github.com/spring-projects/spring-boot/issues/10647

更新:该问题已于 2017 年 10 月 17 日在 spring-boot master 分支中修复。应该是 M6 版本的一部分。

【问题讨论】:

  • 什么版本的maven?什么依赖和什么执行命令?如果你分享 pom.xml 就好了。到目前为止,这个问题的信息非常少。除非您在任一平台上手动修改了某些配置,否则为什么执行会有所不同?此外,ASM_6.x 与 Java9 兼容,之前没有其他版本。
  • @nullpointer 更新了问题中的 Maven 和 spring boot 版本。都是最新的。依赖项包括 guava 和 commons-lang3,但切换到 Jetty 而不是 Tomcat。除此之外,我还有一些排除项来解决问题,例如模块 M 从 M1 和 M2 读取包 x.y 在这里解决 - stackoverflow.com/questions/44697738/… 有什么办法可以强制 Maven 构建使用 ASM_6?
  • 这是最新的里程碑版本 - github.com/spring-projects/spring-boot/releases 用 POM 文件详细信息更新了问题

标签: java spring maven spring-boot java-9


【解决方案1】:

你的mvn dependency:tree描述如下:-

➜[main] [INFO] +- org.springframework.boot:spring-boot-starter-jetty:jar:2.0.0.M5:compile
 [main] [INFO] |  +- org.eclipse.jetty:jetty-servlets:jar:9.4.7.v20170914:compile
 [main] [INFO] |  |  +- org.eclipse.jetty:jetty-continuation:jar:9.4.7.v20170914:compile
 [main] [INFO] |  |  +- org.eclipse.jetty:jetty-http:jar:9.4.7.v20170914:compile
 [main] [INFO] |  |  +- org.eclipse.jetty:jetty-util:jar:9.4.7.v20170914:compile
 [main] [INFO] |  |  \- org.eclipse.jetty:jetty-io:jar:9.4.7.v20170914:compile
 [main] [INFO] |  +- org.eclipse.jetty:jetty-webapp:jar:9.4.7.v20170914:compile
 [main] [INFO] |  |  +- org.eclipse.jetty:jetty-xml:jar:9.4.7.v20170914:compile
 [main] [INFO] |  |  \- org.eclipse.jetty:jetty-servlet:jar:9.4.7.v20170914:compile
 [main] [INFO] |  |     \- org.eclipse.jetty:jetty-security:jar:9.4.7.v20170914:compile
 [main] [INFO] |  |        \- org.eclipse.jetty:jetty-server:jar:9.4.7.v20170914:compile
 [main] [INFO] |  +- org.eclipse.jetty.websocket:websocket-server:jar:9.4.7.v20170914:compile
 [main] [INFO] |  |  +- org.eclipse.jetty.websocket:websocket-common:jar:9.4.7.v20170914:compile
 [main] [INFO] |  |  |  \- org.eclipse.jetty.websocket:websocket-api:jar:9.4.7.v20170914:compile
 [main] [INFO] |  |  +- org.eclipse.jetty.websocket:websocket-client:jar:9.4.7.v20170914:compile
 [main] [INFO] |  |  |  \- org.eclipse.jetty:jetty-client:jar:9.4.7.v20170914:compile
 [main] [INFO] |  |  \- org.eclipse.jetty.websocket:websocket-servlet:jar:9.4.7.v20170914:compile
 [main] [INFO] |  |     \- javax.servlet:javax.servlet-api:jar:3.1.0:compile
 [main] [INFO] |  +- org.eclipse.jetty.websocket:javax-websocket-server-impl:jar:9.4.7.v20170914:compile
 [main] [INFO] |  |  +- org.eclipse.jetty:jetty-annotations:jar:9.4.7.v20170914:compile
 [main] [INFO] |  |  |  +- org.eclipse.jetty:jetty-plus:jar:9.4.7.v20170914:compile
➜[main] [INFO] |  |  |  +- org.ow2.asm:asm:jar:5.1:compile
 [main] [INFO] |  |  |  \- org.ow2.asm:asm-commons:jar:5.1:compile
 [main] [INFO] |  |  |     \- org.ow2.asm:asm-tree:jar:5.1:compile

这清楚地反映了你的项目对spring-boot-starter-jetty 的依赖依赖于asm:5.1 并且asm 的版本与最新的Java 版本不兼容。您可以尝试升级到6.0_BETA 版本。


据我从this issue 得知,jetty 没有升级到最新版本是因为它与 OSGI 版本号不兼容。我在尝试制作vaadin8 application work with Java 9 时遇到了这个问题,其中我可以实现的解决方案是在本地构建码头,然后在我的项目中使用自定义版本,如答案中所述 -

这是在克服 #jetty.project/1758 之后实现的 升级到 asm 和 asm-commons 库的 6.0_BETA 并使用 在项目中使用的本地构建的自定义 9.4.7-SNAPSHOT(提交 - #e34415。)


更新:这确实是bug in spring-boot milestone,正如已编辑问题中所确认的那样。

【讨论】:

  • asm 库现已发布第 6 版。但即便如此,我似乎仍然有这个问题。尝试了几次,但无法使其正常工作。依赖关系树现在没有任何旧版本的 asm,除了 maven-dependency-plugin 使用的版本,如此处第 222 行 - gist.github.com/techpavan/…
  • @PavanKumar 您也可以尝试将其更新为3.0.2.. 如果您可以共享一个示例项目来重现此内容,那就太好了。这列出了 maven 用于 JAva9 兼容性的第三方组件及其版本 - cwiki.apache.org/confluence/display/MAVEN/Java+9+-+Jigsaw
  • 用复制器更新了票证。另外,添加了一些描述。请看一下。对我来说,这似乎是一个需要在 Spring Boot 库上解决的问题。
  • 感谢您的支持。已将问题报告给 Spring 社区,并作为错误被接受,应在下一个 Milestone 版本中修复。
  • @PavanKumar 这显然是一个错误。这棵树描绘了这一点。只是现在试图重现。现在就让它休息吧:)
【解决方案2】:

感谢 GitHub 上的 wilkinsona,他的 workaround 在这个问题上帮助了我。只需添加带有 mainClass 条目的 spring-boot-maven-plugin 配置就可以在 M5 版本中解决此问题。预计会对 M6 进行适当的修复。

         <plugin>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-maven-plugin</artifactId>
+            <configuration>
+                <mainClass>com.test.TestMain</mainClass>
+            </configuration>
         </plugin>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-08
    • 2014-11-30
    • 2020-07-16
    • 1970-01-01
    • 2022-01-07
    • 2018-01-22
    • 2019-05-02
    相关资源
    最近更新 更多