naX*_*aXa 5 google-app-engine dependencies nosuchmethoderror datanucleus spring-data-jpa
在我的项目(Spring Framework + Google App Engine + DataNucleus + JPA)中,我在服务器启动时遇到以下异常:
WARNING: Nestedin org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': Invocation of init method failed;
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/spring/db.xml]: Invocation of init method failed;
nested exception is java.lang.NoSuchMethodError: org.datanucleus.metadata.MetaDataUtils.parsePersistenceFiles(Lorg/datanucleus/plugin/PluginManager;Ljava/lang/String;ZLorg/datanucleus/NucleusContext;)[Lorg/datanucleus/metadata/PersistenceFileMetaData;:
java.lang.NoSuchMethodError: org.datanucleus.metadata.MetaDataUtils.parsePersistenceFiles(Lorg/datanucleus/plugin/PluginManager;Ljava/lang/String;ZLorg/datanucleus/NucleusContext;)[Lorg/datanucleus/metadata/PersistenceFileMetaData;
at org.datanucleus.api.jpa.JPAEntityManagerFactory.<init>(JPAEntityManagerFactory.java:342)
at org.datanucleus.api.jpa.PersistenceProviderImpl.createEntityManagerFactory(PersistenceProviderImpl.java:91)
Run Code Online (Sandbox Code Playgroud)
显然,在persistence.xml解析过程中会抛出此异常.Spring尝试调用方法MetaDataUtils#parsePersistenceFiles(PluginManager,String,NucleusContext,nucCtx),但它不存在.这种方法是其中的一部分org.datanucleus:datanucleus-core.起初我以为我在某处缺少或重复依赖.我已经执行了
gradle dependencies
Run Code Online (Sandbox Code Playgroud)
仔细扫描输出,发现没有什么可疑:只有单一版本的依赖.
根据文档MetaDataUtils只有一种parsePersistenceFiles方法:
public static PersistenceFileMetaData[] parsePersistenceFiles(
PluginManager pluginMgr, String persistenceFilename, boolean validate, ClassLoaderResolver clr);
Run Code Online (Sandbox Code Playgroud)
如果你是观察者,你可能已经注意到它在论点上有所不同:还有一个额外的boolean validate论点.奇怪的是,在任何版本的DataNucleus中都没有这样的方法.为什么DataNucleus正在寻找甚至不存在的方法?我无法得到它.

请帮助DataNucleus和我找到丢失的方法!
更新
正如尼尔斯托克顿所指出的那样,因为我使用的是不一致版本的datanucleus-core和datanucleus-api-jpa.但我不知道依赖项的正确组合.我开始认为,DataNucleus App Engine插件3.0目前尚未准备好使用.
我想使用DataNucleus App Engine插件3.0因为这个问题(在DataNucleus版本3.2.6和3.3.3中修复),因为我需要JPA 2.1功能(获取组/实体图).DataNucleus App Engine插件3.0 与上述版本的DataNucleus 兼容,但未发布.我已经检查了SVN的插件,将其打包,并以jar形式添加到我的项目中(如果您想自己重复此设置,可以下载相同的jar ).
的build.gradle:
apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'appengine'
dependencies {
// App Engine
compile fileTree(dir: 'libs', include: ['*.jar']) // There is datanucleus-appengine-3.0.0-20140128.jar in libs
appengineSdk 'com.google.appengine:appengine-java-sdk:1.9.19'
compile 'com.google.appengine:appengine-api-1.0-sdk:1.9.19'
// persistence
// App Engine and DataNucleus compatibility:
// https://code.google.com/p/datanucleus-appengine/wiki/Compatibility
compile 'org.eclipse.persistence:javax.persistence:2.1.0'
runtime 'org.datanucleus:datanucleus-core:3.2.15'
compile 'org.datanucleus:datanucleus-api-jpa:3.1.3'
compile 'javax.jdo:jdo-api:3.1'
compile 'org.datanucleus:datanucleus-jodatime:3.2.1'
// Spring Framework
compile("org.springframework:spring-webmvc:4.1.6.RELEASE")
compile ("org.springframework.data:spring-data-jpa:1.8.0.RELEASE")
providedCompile 'javax.annotation:javax.annotation-api:1.2'
compile 'com.google.code.gson:gson:2.3.1'
providedCompile 'org.projectlombok:lombok:1.16.+'
}
appengine {
downloadSdk = true
httpAddress = "0.0.0.0"
}
Run Code Online (Sandbox Code Playgroud)
春天背景:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"
default-autowire="byName">
<jpa:repositories base-package="<my.package.name>.repositories" />
<!-- The simplest and the most limited form of JPA deployment -->
<!-- For details see http://docs.spring.io/spring/docs/current/spring-framework-reference/html/orm.html#orm-jpa -->
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="transactions-optional" />
</bean>
<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
</beans>
Run Code Online (Sandbox Code Playgroud)
持久性单位
<persistence-unit name="transactions-optional">
<provider>org.datanucleus.api.jpa.PersistenceProviderImpl</provider>
<properties>
<property name="datanucleus.NontransactionalRead" value="true" />
<property name="datanucleus.NontransactionalWrite" value="true" />
<property name="datanucleus.ConnectionURL" value="appengine" />
<property name="datanucleus.appengine.datastoreEnableXGTransactions" value="true" />
</properties>
</persistence-unit>
Run Code Online (Sandbox Code Playgroud)
更新:例如,
如果我将另一个版本的datanucleus-api-jpa放在CLASSPATH上
compile 'org.datanucleus:datanucleus-api-jpa:3.2.2'
Run Code Online (Sandbox Code Playgroud)
我在增强期间遇到异常:
java.lang.RuntimeException: Unexpected exception
at com.google.appengine.tools.enhancer.Enhancer.execute(Enhancer.java:76)
at com.google.appengine.tools.enhancer.Enhance.<init>(Enhance.java:71)
... 1 more
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
... 5 more
Caused by: org.datanucleus.exceptions.NucleusException:
Plugin (Bundle) "org.datanucleus.api.jpa" is already registered.
Ensure you dont have multiple JAR versions of the same plugin in the classpath.
The URL "file:/<GRADLE_HOME>/appengine-sdk/appengine-java-sdk-1.9.19/lib/opt/tools/datanucleus/v2/datanucleus-api-jpa-3.1.3.jar" is already registered,
and you are trying to register an identical plugin located at URL "file:/<GRADLE_HOME>/caches/modules-2/files-2.1/org.datanucleus/datanucleus-api-jpa/3.2.2/c24c14634c39b5b9a59dcd379dbb6d93da97f3e7/datanucleus-api-jpa-3.2.2.jar."
at org.datanucleus.plugin.NonManagedPluginRegistry.registerBundle(NonManagedPluginRegistry.java:541)
at org.datanucleus.plugin.NonManagedPluginRegistry.registerBundle(NonManagedPluginRegistry.java:395)
Run Code Online (Sandbox Code Playgroud)
来自文档:
App Engine Java SDK包含App Engine的DataNucleus插件的2.x版.此插件对应于DataNucleus Access Platform 3.0版,它允许您通过JPA 2.0使用App Engine数据存储区.
JPA提供了与关系数据库交互的标准接口,但App Engine数据存储区不是关系数据库.因此,App Engine无法支持JPA的功能.
简单的事实是,您必须使用各种 jar 的一致版本。如果使用 Google 的“datanucleus-appengine”v3.0 (SVN),那么您必须拥有 DataNucleus 项目“datanucleus-core”、“datanucleus-api-jpa”v3.2.x(或 datanucleus-api-jpa 的 3.3.x) ),没有其他版本。如果您收到一些关于
插件(捆绑包)“org.datanucleus.api.jpa”已注册。
那么你的 CLASSPATH 中有该插件的多个版本,你应该修复你的 CLASSPATH (只需打印 CLASSPATH 中的内容,它会告诉你......类似 System.getProperty("java.class.path") 的东西)。
在你的情况下你有
文件://appengine-sdk/appengine-java-sdk-1.9.19/lib/opt/tools/datanucleus/v2/datanucleus-api-jpa-3.1.3.jar
和
文件://caches/modules-2/files-2.1/org.datanucleus/datanucleus-api-jpa/3.2.2/c24c14634c39b5b9a59dcd379dbb6d93da97f3e7/datanucleus-api-jpa-3.2.2.jar
所以摆脱第一个
| 归档时间: |
|
| 查看次数: |
824 次 |
| 最近记录: |