2017-10-14 109 views
3

我正在构建的Java 9应用程序编译并在IntelliJ IDE中运行良好。在IDE上,我尝试配置Spring Boot应用程序以及普通应用程序,并且两种配置都很好。Maven构建Java 9弹簧引导应用程序时的RuntimeException

在执行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构建时,它是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框架,或者任何一个问题解决方法存在。

Maven版本:3.5.0

春季启动:2.0.0.M5

其模块化的结构和POM文件的位置:https://gist.github.com/techpavan/faa81d04cd50e7403b03d70a2e

一个更简单的再生可在这里 - https://github.com/techpavan/java9-maven-spring-boot

有了这个重现器,你可以发现maven build很容易失败。但是,当在org.springframework.asm.ClassVisitor>第78行(构造函数)处放置断点并在执行期间将api值更新为393216(ASM6)时,您会发现构建成功完成。默认情况下,该值设置为262144(ASM4)未有在线路147

更新:这个问题是由Spring社区接受错误,并应固定在里程碑6版本 - https://github.com/spring-projects/spring-boot/issues/10647

更新:该问题在2017年10月17日的spring-boot master分支中得到修复。应该是M6发布的一部分。

+1

什么版本的maven?什么依赖和什么命令的执行?很好,如果你分享pom.xml。截至目前,这个问题的信息非常少。为什么执行会有所不同,除非您已在任一平台上手动修改某些配置?另外,ASM_6.x与Java9兼容,并且没有其他版本。 – nullpointer

+0

@nullpointer更新问题中的Maven和Spring启动版本。最新的。依赖包括番石榴和commons-lang3,但切换到Jetty而不是Tomcat。除此之外,我还有一些例外情况来解决模块M从M1和M2读取软件包xy的问题 - https://stackoverflow.com/questions/44697738/how-to-resolve-module-reads-package-error -in-java9/ 有什么办法可以强制Maven构建使用ASM_6? –

+0

这里是:https://gist.github.com/techpavan/bd19a677de7e05d34a96a149cc706299 –

回答

0

感谢wilkinsona在GitHub的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> 
5

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知道,码头没有升级到最新版本,因为它与OSGI的版本号不兼容。我会面对这个问题,而试图让vaadin8 application work with Java 9,其中解决方案,我能做到是本地构建码头,然后在我的项目中使用自定义版本,如在回答说 -

这是得到克服之后# jetty.project/1758由 升级到6。ASM的和ASM-公共图书馆0_BETA和使用 自定义9.4.7-SNAPSHOT建立在我的本地项目中使用的(提交 - #e34415。)


更新:此在编辑的问题中确实也是bug in spring-boot milestone

+0

asm库现在已发布版本6。但即使如此,我似乎仍然存在这个问题。尝试了几次尝试,并没有得到它的工作。依赖关系树现在没有任何旧版本的asm,除了正如第222行中的maven-dependency-plugin所使用的那样 - https://gist.github.com/techpavan/bd19a677de7e05d34a96a149cc706299#file-dependency-output-txt- L222 –

+1

@PavanKumar你可以尝试更新以及['3.0.2'](https://search.maven.org/#artifactdetails%7Corg.apache.maven.plugins%7Cmaven-dependency-plugin%7C3.0.2 %7Cmaven-plugin)..如果你能分享一个示例项目来重现这一点,那将是非常棒的。这列出了第三方组件及其版本供Maven使用,以实现JAva9的兼容性 - https://cwiki.apache.org/confluence/display/MAVEN/Java+9+-+Jigsaw – nullpointer

+0

使用复制器更新了票证。另外,添加了一些说明。请看一下。对我来说,这似乎是一个需要在Spring Boot库上修复的问题。 –

相关问题