Java 9 spring 引导应用程序的 Maven 构建期间出现 RuntimeException
RuntimeException during maven build of Java 9 spring boot application
我正在构建的 Java 9 应用程序可以从 IntelliJ IDE 编译并运行良好。在 IDE 上,我尝试配置为 Spring 启动应用程序和普通应用程序,两种配置都运行良好。
在执行 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
经分析,是由于提供的ASMapi级别所致。直接执行时,它是 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
如果我需要将此报告为 Spring 框架的问题,或者是否存在任何解决方法,请告诉我。
Maven 版本:3.5.0
Spring 开机: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 版本的一部分。
您的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 didn't upgrade to the latest version because of its incompatibility with OSGI version number. I'd faced that issue while trying to make 中了解到,我可以实现的解决方案是在本地构建码头,然后在我的项目中使用自定义版本,如答案中所述 -
This was attained after overcoming the #jetty.project/1758 by
upgrading to the 6.0_BETA of asm and asm-commons libraries and using
the custom 9.4.7-SNAPSHOT built on my local used in the project(commit
- #e34415.)
更新:这确实是一个bug in spring-boot milestone,正如编辑问题中所确认的那样。
感谢 wilkinsona 在 GitHub 上的 workaround 帮助我解决了这个问题。只需在 M5 版本上添加带有 mainClass
条目的 spring-boot-maven-plugin 配置即可解决此问题。预计将对 M6 进行适当修复。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
+ <configuration>
+ <mainClass>com.test.TestMain</mainClass>
+ </configuration>
</plugin>
我正在构建的 Java 9 应用程序可以从 IntelliJ IDE 编译并运行良好。在 IDE 上,我尝试配置为 Spring 启动应用程序和普通应用程序,两种配置都运行良好。
在执行 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
经分析,是由于提供的ASMapi级别所致。直接执行时,它是 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
如果我需要将此报告为 Spring 框架的问题,或者是否存在任何解决方法,请告诉我。
Maven 版本:3.5.0
Spring 开机: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 版本的一部分。
您的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 didn't upgrade to the latest version because of its incompatibility with OSGI version number. I'd faced that issue while trying to make
This was attained after overcoming the #jetty.project/1758 by upgrading to the 6.0_BETA of asm and asm-commons libraries and using the custom 9.4.7-SNAPSHOT built on my local used in the project(commit - #e34415.)
更新:这确实是一个bug in spring-boot milestone,正如编辑问题中所确认的那样。
感谢 wilkinsona 在 GitHub 上的 workaround 帮助我解决了这个问题。只需在 M5 版本上添加带有 mainClass
条目的 spring-boot-maven-plugin 配置即可解决此问题。预计将对 M6 进行适当修复。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
+ <configuration>
+ <mainClass>com.test.TestMain</mainClass>
+ </configuration>
</plugin>