我具有以下项目结构(在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_OPTS增加了Maven的内存,但也没有变化。
有没有人有类似的行为,可以向我展示解决方案或至少提出一个想法可能导致这种情况?手动编译每个文件或让Maven进行编译有什么不同?依赖关系可能是个问题,还是我自己的代码中更有可能?
答案 0 :(得分:1)
执行另一项测试以确认问题。从根目录运行mvn clean install -pl :sub3 -am
。如果构建因相同的编译器错误而失败,则表明您与根目录和sub3
模块的行为不同。
根据https://github.com/ztellman/virgil/issues/16,很少有类似的问题,这可能是由依赖性引起的,例如Lombok生成不支持版本的字节码。
通过两种不同的方式运行mvn dependency:tree
比较已解决的Maven依赖关系:
从项目根目录中查看编译失败的sub3
模块的依赖关系树。
直接在sub3
模块中。
如果它们不相同,请标识不同的库或依赖项版本。
如果这样不起作用,请隔离在每个Maven模块中执行的编译器任务。可以通过设置Maven Compiler Plugin compile:compile properties:
来完成。 maven.compiler.compilerReuseStrategy=alwaysNew
maven.compiler.fork=true