19

我在设置 datanucleus 增强器以与谷歌应用程序引擎项目一起使用时遇到问题。如果我使用 datanucleus eclipse 插件一切顺利,但在我的 maven 项目中,我得到一个奇怪的冲突版本错误。

我的 POM 有这些数据核参考:

<dependency>
    <groupId>org.datanucleus</groupId>
    <artifactId>datanucleus-core</artifactId>
    <version>1.1.0</version>
</dependency>

...

<plugin>
    <groupId>org.datanucleus</groupId>
    <artifactId>maven-datanucleus-plugin</artifactId>
    <version>1.1.0</version>
    <configuration>
        <mappingIncludes>**/*.class</mappingIncludes>
        <verbose>true</verbose>
        <enhancerName>ASM</enhancerName>
        <api>JDO</api>
    </configuration>
    <executions>
        <execution>
        <phase>compile</phase>
        <goals>
            <goal>enhance</goal>
        </goals>
        </execution>
    </executions>
</plugin>

当我尝试构建项目时,出现以下错误:

线程“main”插件(Bundle)“org.datanucleus”中的异常已注册。
确保类路径中没有同一个插件的多个 JAR 版本。URL“file:/Users/drome/.m2/repository/org/datanucleus/datanucleus-core/1.1.0/**datanucleus-core-1.1.0.jar**”已注册,您正在尝试在 URL“file:/Users/drome/.m2/repository/org/datanucleus/datanucleus-core/1.1.3/**datanucleus-core-1.1.3.jar**”注册一个相同的插件。
org.datanucleus.exceptions.NucleusException:插件(捆绑)“org.datanucleus”已注册。确保类路径中没有同一个插件的多个 JAR 版本。URL "file:/Users/drome/.m2/repository/org/datanucleus/datanucleus-core/1.1.0/datanucleus-core-1.1.0.jar" 已注册,您正在尝试注册相同的插件位于 URL “file:/Users/drome/.m2/repository/org/datanucleus/datanucleus-core/1.1.3/datanucleus-core-1.1.3.jar”。
在 org.datanucleus.plugin.NonManagedPluginRegistry.registerBundle(NonManagedPluginRegistry.java:437)
在 org.datanucleus.plugin.NonManagedPluginRegistry.registerBundle(NonManagedPluginRegistry.java:343)
在 org.datanucleus.plugin.NonManagedPluginRegistry.registerExtensions(NonManagedPluginRegistry.java:227
)
在 org.datanucleus.plugin.NonManagedPluginRegistry.registerExtensionPoints(NonManagedPluginRegistry.jav
答:159)
在 org.datanucleus.plugin.PluginManager.registerExtensionPoints(PluginManager.java:82)
在 org.datanucleus.OMFContext.(OMFContext.java:164)
在 org.datanucleus.enhancer.DataNucleusEnhancer.(DataNucleusEnhancer.java:171)
在 org.datanucleus.enhancer.DataNucleusEnhancer.(DataNucleusEnhancer.java:149)
在 org.datanucleus.enhancer.DataNucleusEnhancer.main(DataNucleusEnhancer.java:1157)

我不明白为什么 datanucleus 需要 maven 下载 datanucleus-core-1.1.3.jar,因为 pom.xml 中没有引用它

我也不明白为什么要注册 datanucleus-core-1.1.3.jar ......

有任何想法吗?提前致谢...

4

6 回答 6

6

DN M2 插件引入了它需要完成其工作的可用 DN jar 的最新版本(除了使用最新版本之外,没有其他明智的方法可以做到这一点)。您想将“核心”限制为不同的版本,或者通过指定核心的插件依赖项,或者通过在您的应用程序中指定

<dependency>
    <groupId>org.datanucleus</groupId>
    <artifactId>datanucleus-core</artifactId>
    <version>1.1.0</version>
    <scope>runtime</scope> 
</dependency>
于 2009-05-18T15:39:25.013 回答
5

不幸的是,答案在评论中“隐藏”了:

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

这对我有用!

于 2009-06-07T12:38:27.490 回答
2

我在测试 maven gae 插件原型时遇到了同样的问题。

我通过在我的 gae 运行时传递依赖项中添加排除项来修复它

<!-- Google App Engine meta-package -->
        <dependency>
            <groupId>net.kindleit</groupId>
            <artifactId>gae-runtime</artifactId>
            <version>${gae.version}</version>
            <type>pom</type>
            <exclusions>
                <exclusion>
                    <groupId>com.google.appengine.orm</groupId>
                    <artifactId>datanucleus-core</artifactId>
                </exclusion>

            </exclusions>
        </dependency>

然后将核心核心添加为运行时依赖项

<dependency>
            <groupId>org.datanucleus</groupId>
            <artifactId>datanucleus-core</artifactId>
            <version>${datanucleus-core.version}</version>
            <scope>runtime</scope>
            <exclusions>
                <exclusion>
                    <groupId>javax.transaction</groupId>
                    <artifactId>transaction-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

保持 gae 插件部分简单:

<plugin>
                <groupId>org.datanucleus</groupId>
                <artifactId>maven-datanucleus-plugin</artifactId>
                <version>${maven-datanucleus-plugin.version}</version>
                <configuration>
                    <!--
                        Make sure this path contains your persistent classes!
                    -->
                    <mappingIncludes>**/model/*.class</mappingIncludes>
                    <verbose>true</verbose>
                    <enhancerName>ASM</enhancerName>
                    <api>JDO</api>
                </configuration>
                <executions>
                    <execution>
                        <phase>compile</phase>
                        <goals>
                            <goal>enhance</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
于 2010-11-19T16:19:23.647 回答
2

在阅读了“如何在 Maven 中覆盖插件的依赖项”之后,我找到了另一种解决此问题的方法。这是我的POM:

<plugin>
  <groupId>org.datanucleus</groupId>
  <artifactId>maven-datanucleus-plugin</artifactId>
  <version>3.1.0-m3</version>
  <configuration>
    <verbose>true</verbose>
  </configuration>

  <executions>
    <execution>
      <phase>process-classes</phase>
      <goals>
        <goal>enhance</goal>
      </goals>
    </execution>
  </executions>

  <dependencies>
    <dependency>
      <groupId>org.datanucleus</groupId>
      <artifactId>datanucleus-core</artifactId>
      <version>3.0.4</version>
    </dependency>
  </dependencies>
</plugin>
于 2012-07-28T12:19:54.900 回答
0

从本地 Maven 存储库中清除旧版本的 datanucleus 也可以解决问题。

于 2009-07-18T21:55:47.777 回答
0

自 3.1.1 版以来,Maven-datanucleus-plugin 已停止引入可用 datanucleus-core 的最新版本。

检查 Maven-datanucleus-plugin 3.1.1 的 POM 文件之间的差异(http://repo1.maven.org/maven2/org/datanucleus/maven-datanucleus-plugin/3.1.1/maven-datanucleus-plugin-3.1 .1.pom)和 3.1.0-release(http://mvnrepository.com/artifact/org.datanucleus/maven-datanucleus-plugin/3.1.0-release)。

对于 maven-datanucleus-plugin 3.1.1,datanucleus-core 依赖的版本范围是 (3.0.99, 3.1.99),对于 maven-datanucleus-plugin 3.1.0-release,它是 (3.0.99, )。难怪旧版本的 maven-datanucleus-plugin 会自动引入最新版本的 datanucleus-core。

于 2013-02-04T16:00:55.903 回答