अपने प्रोजेक्ट में (स्प्रिंग फ्रेमवर्क + गूगल एप इंजन + DataNucleus + जेपीए) मैं सर्वर स्टार्टअप पर निम्न अपवाद प्राप्त करें:DataNucleus AppEngine प्लगइन v3 के लिए निर्भरताओं को कॉन्फ़िगर कैसे करें?
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)
जाहिर है इस अपवाद persistence.xml
पार्स दौरान throwed है। वसंत विधि MetaDataUtils#parsePersistenceFiles(PluginManager,String,NucleusContext,nucCtx)
विधि का आह्वान करने की कोशिश करता है, लेकिन यह अनुपस्थित है। यह विधि org.datanucleus:datanucleus-core
का हिस्सा है। पहले मैंने सोचा कि मेरे पास कहीं लापता या डुप्लिकेट निर्भरता है। मैंने
gradle dependencies
ध्यान से स्कैन आउटपुट और कुछ भी संदिग्ध नहीं पाया है: निर्भरता का केवल एक संस्करण।
public static PersistenceFileMetaData[] parsePersistenceFiles(
PluginManager pluginMgr, String persistenceFilename, boolean validate, ClassLoaderResolver clr);
आप चौकस हैं, तो आप शायद देखा है कि यह बहस में अंतर होता है:: वहाँ एक अतिरिक्त boolean validate
तर्क है
प्रलेखन MetaDataUtils
के अनुसार केवल एक parsePersistenceFiles
विधि है। अजीब बात यह है कि डेटा न्यूक्लियस के किसी भी संस्करण में ऐसी कोई विधि नहीं है। डेटा न्यूक्लियस उस विधि की तलाश क्यों कर रहा है जो अस्तित्व में नहीं है? मुझे यह नहीं मिल रहा है।
कृपया डेटा न्यूक्लियस की सहायता करें और मुझे गुम विधि ढूंढें!
अद्यतन
Neil Stockton के रूप में बताया क्योंकि मैं datanucleus कोर और datanucleus-api-जेपीए के असंगत संस्करण का उपयोग कर रहा हूँ यह है। लेकिन मुझे निर्भरताओं का सही संयोजन नहीं पता है। और मुझे लगता है कि डेटा न्यूक्लियस ऐप इंजन प्लगइन 3.0 वर्तमान में उपयोग के लिए तैयार नहीं है।
मैं DataNucleus App इंजन प्लगइन 3.0 उपयोग करना चाहते हैं की वजह से this issue (DataNucleus संस्करणों 3.2.6 और 3.3.3 में तय) और क्योंकि मैं जेपीए 2.1 सुविधाओं की जरूरत है (लाने समूहों/संस्था रेखांकन)। डेटा न्यूक्लियस ऐप इंजन प्लगइन 3.0 compatible डेटा न्यूक्लियस के उल्लिखित संस्करणों के साथ है, लेकिन अप्रकाशित है। मैंने एसवीएन से प्लगइन की जांच की है, इसे पैक किया है, और मेरी परियोजना में जार के रूप में जोड़ा है (यदि आप इस सेटअप को दोहराना चाहते हैं तो एक समान जार download के लिए उपलब्ध है)।
बिल्ड।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"
}
स्प्रिंग संदर्भ:
<?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>
हठ इकाई
<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>
अद्यतन:
अगर मैं डाल CLASSPATH पर एक और संस्करण की datanucleus-api-जेपीए , उदाहरण के लिए
compile 'org.datanucleus:datanucleus-api-jpa:3.2.2'
मैं वृद्धि के दौरान एक अपवाद प्राप्त करें: प्रलेखन से
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)
:
App इंजन जावा एसडीके App इंजन के लिए DataNucleus प्लगइन का संस्करण 2.x भी शामिल है। यह प्लगइन डेटा न्यूक्लियस एक्सेस प्लेटफ़ॉर्म के संस्करण 3.0 से मेल खाता है, जो आपको जेपीए 2.0 के माध्यम से ऐप इंजन डेटास्टोर का उपयोग करने में सक्षम बनाता है।
जेपीए संबंधपरक डेटाबेस के साथ बातचीत के लिए एक मानक इंटरफ़ेस प्रस्तुत करता है, लेकिन ऐप इंजन डेटास्टोर एक संबंधपरक डेटाबेस नहीं है। नतीजतन, जेपीए की विशेषताएं हैं कि ऐप इंजन बस समर्थन नहीं कर सकता है।
से छुटकारा पाने के। वसंत उस कॉल को आपके स्टैक ट्रेस शो के रूप में नहीं बना रहा है, जिसे org.datanucleus.api.jpa.XXX –