【发布时间】: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
如果我需要将此问题报告为 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