有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

root-folder: containing parent pom, defining 1.8 for build and group/version, listing sub1, sub2, sub3 as modules
sub1: first module (jar), refering to parent pom
sub2: second module (jar), refering to parent pom, sub1 as dependency
sub3: third module (jar), refering to parent pom, sub2 as dependency

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

但是,当我在父pom上执行mvn clean install时,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进行编译时有什么不同?依赖关系可能是个问题,还是更可能是我自己的代码中的某个东西


共 (1) 个答案

  1. # 1 楼答案

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

    根据https://github.com/ztellman/virgil/issues/16和一些类似的问题,这可能是由依赖项引起的,例如Lombok在不受支持的版本中生成字节码

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

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

    2. 直接在sub3模块中

    如果它们不相同,请确定不同的库或依赖项版本

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

     maven.compiler.compilerReuseStrategy=alwaysNew
     maven.compiler.fork=true