Конфликтующие версии datanucleus Enhancer в проекте maven google app engine

У меня возникла проблема с настройкой datanucleus Enhancer для использования с проектом движка приложений Google. Если я использую плагин 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>

Когда я пытаюсь собрать проект, я получаю следующую ошибку:

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

Любые идеи? Заранее спасибо...


person ivo    schedule 18.05.2009    source источник


Ответы (6)


Плагин DN M2 извлекает последние версии доступных jar-файлов DN, которые ему необходимы для выполнения своей работы (нет другого разумного способа сделать это, кроме как использовать последнюю версию). Вы хотите ограничить «ядро» другой версией, либо указав зависимость плагина от ядра, либо указав это в своем приложении для

<dependency>
    <groupId>org.datanucleus</groupId>
    <artifactId>datanucleus-core</artifactId>
    <version>1.1.0</version>
    <scope>runtime</scope> 
</dependency>
person DataNucleus    schedule 18.05.2009
comment
Я не думаю, что можно исключить другую версию одного и того же артефакта. ‹зависимость› ‹groupId›group-a‹/groupId› ‹artifactId›artifact-a‹/artifactId› ‹version›1.0‹/версия› ‹exclusions› ‹exclusion› ‹groupId›group-c‹/groupId› ‹artifactId› исключенный-артефакт‹/artifactId› ‹/исключение› ‹/исключение› ‹/зависимость› - person ivo; 18.05.2009
comment
Плагин DN M2 делает единственную разумную вещь, которую он может сделать; используйте последнюю. Я не вижу другого способа иметь плагин M2 и не выпускать новую версию каждый раз, когда мы выпускаем новую версию зависимой банки, и для этого были введены диапазоны версий M2. У других людей не было проблем с обработкой этого groups.google.com/group/google-appengine-java/browse_thread/ Очевидно, что Google, обновляющий свою банку плагинов DN, будет означать, что это не имеет значения. - person DataNucleus; 18.05.2009
comment
Перейдя по предоставленной вами ссылке, действительно изменение области действия на «время выполнения» устранило проблему. Спасибо за поддержку :-) - person ivo; 19.05.2009
comment
Я пробовал это, и это, кажется, работает. Но если я запускаю mvn clean compile, я получаю ошибку 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. - person Adrian Ber; 30.10.2013

К сожалению, ответ «спрятан» в комментариях:

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

Это сработало для меня!

person dlinsin    schedule 07.06.2009

Я столкнулся с той же проблемой при тестировании архетипа плагина 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>
person Francois    schedule 19.11.2010

После прочтения "Как переопределить зависимость плагина в Maven», я нашел другой способ исправить это. Вот мой ПОМ:

<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>
person btpka3    schedule 28.07.2012
comment
Я думаю, что это более разумный ответ для этого. Фиксация области действия во время выполнения у меня все равно не работает. Чего я действительно хочу, так это исправить версию datanucleus-core, используемую энхансером, чтобы она совпадала с версией, используемой моим приложением. - person John Michelau; 09.01.2014

очистка вашей старой версии datanucleus из локального репозитория maven также решает проблему.

person Community    schedule 18.07.2009

Maven-datanucleus-plugin перестал получать последние версии доступного datanucleus-core, начиная с версии 3.1.1.

Проверьте различия между файлами POM для Maven-datanucleus-plugin 3.1.1 (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-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.

person snopine    schedule 04.02.2013