首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java 9的Maven编译问题

Java 9的Maven编译问题
EN

Stack Overflow用户
提问于 2017-10-23 04:07:33
回答 9查看 42.4K关注 0票数 82

尝试使用JDK 9.0.1编译Maven项目时,我遇到了这种堆栈跟踪,但没有太多解释:

代码语言:javascript
复制
Exception in thread "main" java.lang.AssertionError
at jdk.compiler/com.sun.tools.javac.util.Assert.error(Assert.java:155)
at jdk.compiler/com.sun.tools.javac.util.Assert.check(Assert.java:46)
at jdk.compiler/com.sun.tools.javac.comp.Modules.enter(Modules.java:250)
at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.readSourceFile(JavaCompiler.java:821)
at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$ImplicitCompleter.complete(JavacProcessingEnvironment.java:1510)
at jdk.compiler/com.sun.tools.javac.code.Symbol.complete(Symbol.java:633)
at jdk.compiler/com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:1314)
at jdk.compiler/com.sun.tools.javac.code.Type$ClassType.complete(Type.java:1139)
at jdk.compiler/com.sun.tools.javac.code.Type$ClassType.getTypeArguments(Type.java:1065)
at jdk.compiler/com.sun.tools.javac.code.Printer.visitClassType(Printer.java:237)
at jdk.compiler/com.sun.tools.javac.code.Printer.visitClassType(Printer.java:52)
at jdk.compiler/com.sun.tools.javac.code.Type$ClassType.accept(Type.java:992)
at jdk.compiler/com.sun.tools.javac.code.Printer.visit(Printer.java:136)
at jdk.compiler/com.sun.tools.javac.util.AbstractDiagnosticFormatter.formatArgument(AbstractDiagnosticFormatter.java:197)
at jdk.compiler/com.sun.tools.javac.util.AbstractDiagnosticFormatter.formatArguments(AbstractDiagnosticFormatter.java:165)
at jdk.compiler/com.sun.tools.javac.util.BasicDiagnosticFormatter.formatMessage(BasicDiagnosticFormatter.java:111)
at jdk.compiler/com.sun.tools.javac.util.BasicDiagnosticFormatter.formatMessage(BasicDiagnosticFormatter.java:67)
at jdk.compiler/com.sun.tools.javac.util.AbstractDiagnosticFormatter.formatArgument(AbstractDiagnosticFormatter.java:183)
at jdk.compiler/com.sun.tools.javac.util.AbstractDiagnosticFormatter.formatArguments(AbstractDiagnosticFormatter.java:165)
at jdk.compiler/com.sun.tools.javac.util.BasicDiagnosticFormatter.formatMessage(BasicDiagnosticFormatter.java:111)
at jdk.compiler/com.sun.tools.javac.util.BasicDiagnosticFormatter.formatMessage(BasicDiagnosticFormatter.java:67)
at jdk.compiler/com.sun.tools.javac.util.JCDiagnostic.getMessage(JCDiagnostic.java:771)
at jdk.compiler/com.sun.tools.javac.api.ClientCodeWrapper$DiagnosticSourceUnwrapper.getMessage(ClientCodeWrapper.java:799)
at org.codehaus.plexus.compiler.javac.JavaxToolsCompiler.compileInProcess(JavaxToolsCompiler.java:131)
at org.codehaus.plexus.compiler.javac.JavacCompiler.performCompile(JavacCompiler.java:174)
at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:1075)
at org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:168)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:309)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:194)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:107)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:993)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:345)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:191)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)

我不确定是什么导致了这个问题,这是JDK中的一个bug吗?

其他详细信息

编译器Maven3.5.0带有maven-

  • -plugin 3.7.0
  • 我只是在执行mvn全新安装
  • 不幸的是,源代码不是开源的,所以我不能自由地分享它
  • 目前还没有模块信息.java文件,我只是想用Java9

编译一个项目如果我把源代码级别留在1.8,代码就会编译,但是如果我把它指定为9<代码>H213<代码>F214,代码就会编译失败,出现上述异常

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2018-09-27 19:58:37

只需添加以下内容

代码语言:javascript
复制
<forceJavacCompilerUse>true</forceJavacCompilerUse>

到你的maven编译器,在POM中构建插件,你会看到所有的javac错误!Source with more details

票数 139
EN

Stack Overflow用户

发布于 2021-08-20 03:18:12

调试

第一步应该是添加maven-compiler-plugin并启用<forceJavacCompilerUse>true</forceJavacCompilerUse>,如上面的答案所示。

代码语言:javascript
复制
<project>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <forceJavacCompilerUse>true</forceJavacCompilerUse>
        </configuration>
      </plugin>
      ...

这将指出实际的编译错误。

代码语言:javascript
复制
[main] INFO org.apache.maven.plugin.compiler.CompilerMojo - -------------------------------------------------------------
[main] ERROR org.apache.maven.plugin.compiler.CompilerMojo - COMPILATION ERROR : 
[main] INFO org.apache.maven.plugin.compiler.CompilerMojo - -------------------------------------------------------------
[main] ERROR org.apache.maven.plugin.compiler.CompilerMojo -    last round: true
/home/vsts/work/1/s/src/main/java/com/company/services/TemplateService.java:[3,61] error: cannot find symbol
  symbol:   class VariableNotFoundException

根本原因

对我来说,根本原因是我提交了一个提交,并将其推送到服务器,这触发了CI,但没有在提交中包含一个正在使用的类。因此,编译器无法在CI环境中找到它。

代码语言:javascript
复制
throws VariableNotFoundException {

解决方案是确保您没有任何忘记在提交时包含的Git暂存文件。

票数 13
EN

Stack Overflow用户

发布于 2017-10-24 04:42:57

更新

大多数时候,这个错误似乎发生在编译器试图报告编译错误的时候,但是在这个过程中失败了。到目前为止,主要有两种方法帮助解决了这些问题:

  • 使用-proc:none编译器参数禁用批注处理(批注处理似乎会扰乱编译器,因此,如果您不打算使用任何批注处理,这是免费的)。
  • 使用条件断点调试编译器并遍历堆栈,直到可以找到编译器错误消息,然后修复该错误...

原始解决方案

经过大量的试验和错误,我能够在本地解决/修复这个问题,最后我的方法如下:

  • 我有一个假设,可能是依赖项以某种方式干扰了构建结果,所以我开始注释掉失败模块的POM中的maven项。
  • 构建然后开始失败,但它这样做是因为预期的无法找到符号和类似的编译错误,而不是无用的AssertionError
  • 。事实证明,有一个特定的依赖项触发了这个AssertionError.
  • After代码分析,我无法确定该依赖项会导致问题的任何原因,所以我开始查看可传递的dependencies
  • I,然后使用了与以前相同的方法。但是,我没有取消注释错误的依赖项,而是将它的所有传递依赖项插入到POM
  • 中构建再次失败,经过大量的测试,结果表明,当io.vavr:vavr:0.9.0:compile和javax.servlet:servlet-api:3.0.1: AssertionError都包含在依赖关系图

中时,我可以触发测试。

我仍然不明白测试范围的依赖如何对项目的编译产生任何影响……它还证明了javax.servlet:servlet-api:3.0.1:provided已经是失败模块的依赖项之一,而测试范围的依赖项实际上并没有用于任何事情。

最后,我从bug触发模块中删除了错误定义的测试范围servlet-api依赖项,突然间Maven能够编译之前失败的模块了。

我相当确定这是一个非常晦涩的问题的一个非常晦涩的答案,但希望我的方法将对其他人有用。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46878649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档