Java 多模块项目中奇怪的编译器行为

Java 多模块项目中奇怪的编译器行为,java,maven,multi-module,Java,Maven,Multi Module,我有以下项目结构(在Windows 10 x64上): 现在,当我按照上面声明的顺序分别在每个模块中进行mvn clean安装时,一切都很好 但是,当我在父pom上执行mvn干净安装时,sub1和sub2构建很好,而在sub3中,我得到了不祥的构建错误 An exception has occurred in the compiler (1.8.0_181). Please file a bug against the Java compiler via the Java bug reporti

我有以下项目结构(在Windows 10 x64上):

现在,当我按照上面声明的顺序分别在每个模块中进行
mvn clean安装时,一切都很好

但是,当我在父pom上执行
mvn干净安装时,sub1和sub2构建很好,而在sub3中,我得到了不祥的构建错误

An exception has occurred in the compiler (1.8.0_181). Please file a bug against the Java compiler via the Java bug reporting page [..]
java.lang.IllegalAccessError: tried to access class com.sun.tools.javac.tree.JCTree$1 from class com.sun.tools.javac.tree.JCTree$JCLiteral
        at com.sun.tools.javac.tree.JCTree$JCLiteral.getValue(JCTree.java:2044)
        at com.sun.tools.javac.parser.JavacParser.merge(JavacParser.java:1034)
[..]
我更新到了最新的JDK 8和Maven,但仍然是相同的错误。我确认JAVA_HOME和PATH设置正确(因为我在系统上有更新的jdk)。我还通过Maven_选项增加了Maven的内存,但也没有改变


有没有人曾经有过类似的行为,可以给我一个解决方案,或者至少提出一个想法,是什么导致了这种情况?手动编译或让maven进行编译时有什么不同?依赖关系可能是一个问题,还是更可能是我自己的代码中的某个问题?

执行一个附加测试以确认问题。从根目录运行
mvn clean install-pl:sub3-am
。如果生成失败并出现与您确认的相同的编译器错误,则它的行为与根目录和
sub3
模块不同

根据和少数类似的问题,这可能是由依赖项引起的,例如Lombok在不受支持的版本中生成字节码

通过以两种不同的方式运行
mvn dependency:tree
来比较已解析的Maven依赖关系:

  • 从项目根目录中,查看编译失败的
    sub3
    模块的依赖关系树

  • 直接在
    sub3
    模块中

  • 如果它们不相同,则标识不同的库或依赖项版本

    如果这不起作用,隔离在每个Maven模块中执行的编译器任务。这可以通过设置:


    你能用早期的JDK编译它吗,例如1.8.0_151?不,我在尝试更新JDK之前就已经有了这个版本,错误是一样的。看起来像个bug,你能发布导致它的代码吗?您可以尝试使用Java9构建,javac中可能存在类似的错误。谢谢您的建议。我确认,如您所说,从根目录使用离散模块列表构建它会导致相同的编译错误。关于依赖关系树,这两种方法是相同的。那么现在这意味着什么呢?@AlexanderRühl你能用
    maven.compiler.compilerReuseStrategy=alwaysNew
    maven.compiler.fork=true
    属性集进行测试吗?尝试任何其他隔离
    javac
    编译器的选项。好吧,我想我可以确定问题所在,我在用JDK 9尝试你的建议时,无意中发现了这个问题,结果显示,我在sub2中使用的一个插件分析字节码就是问题所在。不过,我不明白这会以何种方式影响sub3,而构建sub2是可以的,知道吗?@AlexanderRühl很可能会污染运行Maven的JVM,因此
    sub2
    之后的每个模块都会失败。尝试使用我建议的选项防止编译器重用和分叉,这样每个模块都会以牺牲构建时间为代价获得一个新的编译器。您对编译器隔离属性的建议是有效的,因此即使使用插件,它现在也可以从父级开始工作。非常感谢你的帮助!
    An exception has occurred in the compiler (1.8.0_181). Please file a bug against the Java compiler via the Java bug reporting page [..]
    java.lang.IllegalAccessError: tried to access class com.sun.tools.javac.tree.JCTree$1 from class com.sun.tools.javac.tree.JCTree$JCLiteral
            at com.sun.tools.javac.tree.JCTree$JCLiteral.getValue(JCTree.java:2044)
            at com.sun.tools.javac.parser.JavacParser.merge(JavacParser.java:1034)
    [..]
    
     maven.compiler.compilerReuseStrategy=alwaysNew
     maven.compiler.fork=true