Conflitantes versões do potenciador DataNucleus em um Maven projeto Google App Engine
-
22-08-2019 - |
Pergunta
Estou tendo um problema ao configurar DataNucleus potenciador de usar com um projeto do Google App Engine. Se eu usar o DataNucleus eclipse plug-in tudo correr bem, mas no meu projeto maven eu recebo um estranho erro versão conflitante.
O meu POM tem essas referências 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>
Quando tento construir o projeto eu recebo o seguinte erro:
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)
Eu não entendo por que DataNucleus necessária Maven para baixar DataNucleus-core-1.1.3.jar uma vez que este não é referenciado no pom.xml
Eu também não entendo por que DataNucleus-core-1.1.3.jar está sendo registrado ...
Todas as idéias? Agradecemos antecipadamente ...
Solução
O plugin puxa DN m2 na versões mais recentes dos frascos DN disponíveis que ele precisa para fazer o seu trabalho (não há outra maneira sensata de fazê-lo que não uso o mais recente). Você deseja restringir o "core" para uma versão diferente, tanto especificando a dependência plug-in do núcleo, ou especificando que em seu aplicativo para
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-core</artifactId>
<version>1.1.0</version>
<scope>runtime</scope>
</dependency>
Outras dicas
Infelizmente, a resposta é "escondida" nos comentários:
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-core</artifactId>
<version>1.1.0</version>
<scope>runtime</scope>
</dependency>
Isso funcionou para mim!
Eu corri para o mesmo problema ao testar um maven gae plugin do arquétipo.
Eu fixo-lo adicionando exclusões na minha gae runtime transitivo dependências
<!-- 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>
e, em seguida, adicionando o núcleo como núcleo de um tempo de execução dependência
<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>
como manter a seção de plug-in gae simples:
<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>
Depois de ler " como substituir a dependência de um plugin no Maven ", eu encontrei outra maneira de corrigir isso. Aqui está o meu 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>
limpar a sua versão antiga do DataNucleus de seu repositório maven local também resolver o problema.
Maven-DataNucleus-plugin parou de puxar nas últimas versões do DataNucleus-core disponível desde a versão 3.1.1.
Verifique as diferenças entre os arquivos POM para 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 ) e 3,1,0-libertação ( http://mvnrepository.com/artifact/org.datanucleus/maven-datanucleus-plugin/3.1.0-release ).
Para-maven-DataNucleus Plugin 3.1.1 a gama versão do DataNucleus-core dependência é (3.0.99, 3.1.99), e para-maven-DataNucleus Plugin 3.1.0-liberá-lo é (3.0.99, ). Não admira para as versões mais antigas do Maven-DataNucleus-plugin, ele puxa automaticamente as últimas versões de DataNucleus-core.