数据核增强器在maven中存在冲突的依赖关系 - 第2部分

时间:2013-11-01 17:53:52

标签: java maven datanucleus

此问题与Conflicting versions of datanucleus enhancer in a maven google app engine project有关。我在那里尝试了解决方案并且有效。但是,如果我运行mvn clean编译,我会得到错误

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。

问题是我有两次datanucleus-core:一个来自项目依赖,一个来自插件依赖。在运行mvn datanuleus后的控制台中:增强以下行显示两次:

[INFO] CP: /home/user/.m2/repository/org/datanucleus/datanucleus-core/3.2.7/datanucleus-cor‌​e-3.2.7.jar

2 个答案:

答案 0 :(得分:4)

我终于找到了解决方法。这不是最优雅的解决方案,但我不认为还有另一种解决方案。

解决方法是将datanucleus-core依赖项添加到编译器插件中(请注意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>

datanucleus-core依赖项添加了runtime范围

<dependency>
    <groupId>org.datanucleus</groupId>
    <artifactId>datanucleus-core</artifactId>
    <version>3.2.8</version>
    <scope>runtime</scope>
</dependency>

来自datanucleus enhancer插件的datanucleus-core默认版本被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。

答案 1 :(得分:0)

将datanucleus-core设置为运行时意味着您不需要它进行编译(该线程中的用户需要的内容)。你显然想要运行(DataNucleus)注释处理器(预编译),所以必须有这个存在进行编译,所以你设置datanucleus-magin-plugin使用的datanucleus-core的版本(在它对插件的依赖性下) ,所以它匹配整个pom.xml

使用的内容