这个问题与maven Google App Engine项目中数据核增强器的冲突版本有关。我在那里尝试了解决方案,它有效。但是如果我运行 mvn 干净编译,我会得到错误
Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project XXX: Fatal error compiling: java.lang.NoClassDefFoundError: org/datanucleus/util/AnnotationProcessorUtils: org.datanucleus.util.AnnotationProcessorUtils.
知道为什么吗?我正在使用datanucleus-maven-plugin:3.3.0-release。
问题是我有两次数据核心:一个来自项目依赖项,一个来自插件依赖项。在控制台中运行 mvn datanuleus:enhance 后,以下行出现两次:
[INFO] CP: /home/user/.m2/repository/org/datanucleus/datanucleus-core/3.2.7/datanucleus-core-3.2.7.jar
我终于找到了解决方法。这不是最优雅的解决方案,但我认为没有另一个解决方案。
解决方法是将数据核心依赖项添加到编译器插件中(请注意compile
范围。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<dependencies>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-core</artifactId>
<version>3.2.8</version>
<scope>compile</scope>
</dependency>
</dependencies>
...
</plugin>
数据核心依赖项随runtime
范围一起添加
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-core</artifactId>
<version>3.2.8</version>
<scope>runtime</scope>
</dependency>
并且来自数据核增强器插件的数据核心默认版本被3.2.8
覆盖。
<plugin>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-maven-plugin</artifactId>
<version>3.3.0-release</version>
<dependencies>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-core</artifactId>
<version>3.2.8</version>
</dependency>
</dependencies>
</plugin>
它也适用于 3.2.9 版。
将 datanucleus-core 设置为运行时意味着您不需要它进行编译(该线程中的用户需要什么)。你显然想运行(DataNucleus)注释处理器(预编译),所以必须有它进行编译,所以你设置了datanucleus-maven-plugin使用的datanucleus-core版本(在其对插件的依赖下),所以它与整个pom使用的版本相匹配.xml