代码之家  ›  专栏  ›  技术社区  ›  ivo

Maven Google应用程序引擎项目中数据核心增强程序的冲突版本

  •  19
  • ivo  · 技术社区  · 15 年前

    我在设置DataNucleus增强器以用于Google应用程序引擎项目时遇到问题。如果我使用DataNucleus Eclipse插件,一切都很顺利,但是在我的Maven项目中,我会得到一个奇怪的冲突版本错误。

    我的POM有以下DataNucleus参考:

    <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>
    

    当我尝试构建项目时,会得到以下错误:

    Exception in thread "main" Plugin (Bundle) "org.datanucleus" is already registered. 
    Ensure you dont have multiple JAR versions of the same plugin in the classpath. The URL "file:/Users/drome/.m2/repository/org/datanucleus/datanucleus-core/1.1.0/**datanucleus-core-1.1.0.jar**" is already registered, and you are trying to register an identical plugin located at URL "file:/Users/drome/.m2/repository/org/datanucleus/datanucleus-core/1.1.3/**datanucleus-core-1.1.3.jar**."
    org.datanucleus.exceptions.NucleusException: Plugin (Bundle) "org.datanucleus" is already registered. Ensure you dont have multiple JAR versions of the same plugin in the classpath. The URL "file:/Users/drome/.m2/repository/org/datanucleus/datanucleus-core/1.1.0/datanucleus-core-1.1.0.jar" is already registered, and you are trying to register an identical plugin located at URL "file:/Users/drome/.m2/repository/org/datanucleus/datanucleus-core/1.1.3/datanucleus-core-1.1.3.jar."
    at org.datanucleus.plugin.NonManagedPluginRegistry.registerBundle(NonManagedPluginRegistry.java:437)
    at org.datanucleus.plugin.NonManagedPluginRegistry.registerBundle(NonManagedPluginRegistry.java:343)
    at org.datanucleus.plugin.NonManagedPluginRegistry.registerExtensions(NonManagedPluginRegistry.java:227
    )
    at org.datanucleus.plugin.NonManagedPluginRegistry.registerExtensionPoints(NonManagedPluginRegistry.jav
    a:159)
    at org.datanucleus.plugin.PluginManager.registerExtensionPoints(PluginManager.java:82)
    at org.datanucleus.OMFContext.(OMFContext.java:164)
    at org.datanucleus.enhancer.DataNucleusEnhancer.(DataNucleusEnhancer.java:171)
    at org.datanucleus.enhancer.DataNucleusEnhancer.(DataNucleusEnhancer.java:149)
    at org.datanucleus.enhancer.DataNucleusEnhancer.main(DataNucleusEnhancer.java:1157)
    

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

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

    有什么想法吗? 事先谢谢…

    6 回复  |  直到 12 年前
        1
  •  6
  •   DataNucleus    12 年前

    dn m2插件引入了可用dnjar的最新版本,它需要完成它的工作(除了使用最新版本之外,没有其他合理的方法来完成它)。您希望通过指定core的插件依赖关系或在应用程序中指定来将“core”限制为其他版本。

    <dependency>
        <groupId>org.datanucleus</groupId>
        <artifactId>datanucleus-core</artifactId>
        <version>1.1.0</version>
        <scope>runtime</scope> 
    </dependency>
    
        2
  •  5
  •   dlinsin JaviAlgaba    15 年前

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

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

    那对我有用!

        3
  •  2
  •   Francois quandrum    14 年前

    我在测试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>
    

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

    <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>
    
        4
  •  2
  •   btpka3    12 年前

    读完“ How to override a plugin's dependency in 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>
    
        5
  •  0
  •   Tamer Gür    15 年前

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

        6
  •  0
  •   snopine    12 年前

    自3.1.1版本以来,Maven DataNucleus插件已停止拉入可用DataNucleus核心的最新版本。

    检查maven datanucleus插件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版本( http://mvnrepository.com/artifact/org.datanucleus/maven-datanucleus-plugin/3.1.0-release )

    对于Maven DataNucleus插件3.1.1,DataNucleus核心依赖项的版本范围是(3.0.99,3.1.99),对于Maven DataNucleus插件3.1.0-发布,版本范围是(3.0.99,)。难怪老版本的Maven DataNucleus插件会自动拉入最新版本的DataNucleus核心。