5

अपने प्रोजेक्ट में (स्प्रिंग फ्रेमवर्क + गूगल एप इंजन + 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 विधि है। अजीब बात यह है कि डेटा न्यूक्लियस के किसी भी संस्करण में ऐसी कोई विधि नहीं है। डेटा न्यूक्लियस उस विधि की तलाश क्यों कर रहा है जो अस्तित्व में नहीं है? मुझे यह नहीं मिल रहा है।

Dora
कृपया डेटा न्यूक्लियस की सहायता करें और मुझे गुम विधि ढूंढें!


अद्यतन
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 के माध्यम से ऐप इंजन डेटास्टोर का उपयोग करने में सक्षम बनाता है।
जेपीए संबंधपरक डेटाबेस के साथ बातचीत के लिए एक मानक इंटरफ़ेस प्रस्तुत करता है, लेकिन ऐप इंजन डेटास्टोर एक संबंधपरक डेटाबेस नहीं है। नतीजतन, जेपीए की विशेषताएं हैं कि ऐप इंजन बस समर्थन नहीं कर सकता है।

+0

से छुटकारा पाने के। वसंत उस कॉल को आपके स्टैक ट्रेस शो के रूप में नहीं बना रहा है, जिसे org.datanucleus.api.jpa.XXX –

उत्तर

0

साधारण तथ्य यह है कि आपको विभिन्न जारों के लगातार संस्करणों का उपयोग करना होगा। यदि Google के "डेटाान्यूक्लियस-एपेंगेन" v3.0 (एसवीएन) का उपयोग करते हैं तो आपके पास डेटा न्यूक्लियस प्रोजेक्ट "डेटान्यूक्लियस-कोर", "डैटन्यूक्लियस-एपी-जेपीए" v3.2.x (या डेटान्यूक्लियस-एपी-जेपीए का 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

तो datanucleus कोर और datanucleus-api-जेपीए के असंगत संस्करणों का उपयोग कर पहले एक

+0

कहा जाता है और यदि यह सफलता नहीं दे रहा है तो सामान्य बात यह है कि जब आप इसे करते हैं तो "काम नहीं करता" । –

संबंधित मुद्दे