2012-04-10 6 views
4

Ich entwickle eine Desktop-App mit Datanucleus und JDO für die eingebettete H2-Datenbank. Alles funktioniert gut, wenn ich es von Eclipse aus starte, aber es funktioniert nicht mehr, wenn ich versuche, ein ausführbares Jar daraus zu machen. Ich erhalte einen folgenden Fehler:Datanucleus, JDO und ausführbares jar - wie geht das?

org.datanucleus.exceptions.NucleusUserException: Persistence Verfahren zur Herstellung eines ClassLoaderResolver des Namens „jdo“ verwenden angegeben wurde noch nicht von der Datanucleus-Plugin-Mechanismus gefunden. Bitte überprüfen Sie Ihre CLASSPATH- und Plugin-Spezifikation.

Natürlich zeigt es, dass ich etwas nicht richtig konfiguriert habe - was fehlt mir? Wenn ich etwas Großes vermisste, würde es überhaupt nicht funktionieren, also nehme ich an, dass es ein fehlerhaftes ausführbares Glas ist. Ich habe diesen Fehler in anderen Apps wie JPOX gesehen, wo es behoben wurde, aber ohne irgendeine Lösung gegeben.

Whole Fehler Stacktrace:

Exception in thread "main" javax.jdo.JDOFatalInternalException: Unexpected exception caught. 
     at javax.jdo.JDOHelper.invokeGetPersistenceManagerFactoryOnImplementation(JDOHelper.java:1193) 
     at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:808) 
     at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:701) 
     at db.PersistenceManagerFilter.init(PersistenceManagerFilter.java:44) 
     at Main.main(Main.java:26) 
NestedThrowablesStackTrace: 
java.lang.reflect.InvocationTargetException 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at javax.jdo.JDOHelper$16.run(JDOHelper.java:1965) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at javax.jdo.JDOHelper.invoke(JDOHelper.java:1960) 
     at javax.jdo.JDOHelper.invokeGetPersistenceManagerFactoryOnImplementation(JDOHelper.java:1166) 
     at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:808) 
     at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:701) 
     at db.PersistenceManagerFilter.init(PersistenceManagerFilter.java:44) 
     at Main.main(Main.java:26) 
Caused by: org.datanucleus.exceptions.NucleusUserException: Persistence process has been specified to use a ClassLoaderResolver of name "jdo" yet this has not been found by the DataNucleus plugin mechanism. Please check your CLASSPATH and plugin specification. 
     at org.datanucleus.NucleusContext.<init>(NucleusContext.java:233) 
     at org.datanucleus.NucleusContext.<init>(NucleusContext.java:196) 
     at org.datanucleus.NucleusContext.<init>(NucleusContext.java:174) 
     at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.<init>(JDOPersistenceManagerFactory.java:364) 
     at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.createPersistenceManagerFactory(JDOPersistenceManagerFactory.java:294) 
     at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.getPersistenceManagerFactory(JDOPersistenceManagerFactory.java:195) 
     ... 12 more 

Die Linie es zu den Punkten ist PersistenceManagerFilter init-Methode:

pmf = JDOHelper.getPersistenceManagerFactory(getProperties()); 

Properties-Datei so aussieht:

javax.jdo.PersistenceManagerFactoryClass=org.datanucleus.api.jdo.JDOPersistenceManagerFactory 
datanucleus.ConnectionDriverName=org.h2.Driver 
datanucleus.ConnectionURL=jdbc:h2:datanucleus 
datanucleus.ConnectionUserName=sa 
datanucleus.ConnectionPassword= 

Ich habe alle Abhängigkeiten von maven, mit dem Ziel, mit Abhängigkeiten zu implementieren. Abhängigkeiten sind wie auf datanucleus Seite http://www.datanucleus.org/products/datanucleus/jdo/maven.html

Irgendwelche Ideen?

+0

was "ausführbare jar"? aus was? – DataNucleus

+1

Ganzes Projekt mit Abhängigkeiten von Maven als ausführbare JAR-Datei bereitgestellt. – Paul

+0

Sie meinen, Sie haben die DN-Gläser entarretiert und alles in ein einziges Glas gelegt? – DataNucleus

Antwort

1

Hinzufügen zu DataNucleus Antwort.
Um acheave, was Sie brauchen Sie Maven-Abhängigkeit-Plugin
und fügen Sie folgendes zu Ihrem pom.xml

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>2.4</version> 
      <executions> 
       <execution> 
        <id>copy-dependencies</id> 
        <phase>package</phase> 
        <goals> 
         <goal>copy-dependencies</goal> 
        </goals> 
        <configuration> 
         <outputDirectory>${project.build.directory}/jars</outputDirectory> 
         <overWriteReleases>false</overWriteReleases> 
         <overWriteSnapshots>false</overWriteSnapshots> 
         <overWriteIfNewer>true</overWriteIfNewer> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

Dann werden die Abhängigkeiten in Ziel/Dosen dir wird verwendet werden soll.

Zur Ausführung Ihrer Anwendung Sie verwenden Sie den Befehl:

Fenster:
java -cp "yourFile.jar; Gläser/*" package.className

Linux:
java -cp " yourFile.jar: Gläser/*“package.className

. HINWEIS: keine Gläser/* verwenden Glas, das wird nicht funktionieren

4

Datanucleus Gläser sind alle OSGi-fähige und ein Plugin-Mechanismus Fähigkeiten zu identifizieren verwenden, enthalten so plugin.xml und META-INF/MANIFEST.MF Dateien. Diese müssen sich an den gleichen Stellen befinden wie in den ursprünglichen DN-Jars (vom Stamm des Jars). Wenn du sie entpackst und dann neu aufträgst, musst du alle plugin.xml und META-INF/MANIFEST.MF aus den DN-Jars zusammenführen ... ALLE Informationen dort nicht nur ein paar davon.

+1

Ok, ich bin mir jetzt ziemlich sicher, dass mein Glas korrekt ist und alle erforderlichen Informationen enthält. Ich denke, ich vermisse etwas in Immobilien, was kann es sein? Oder sind sie richtig? Ich habe meinen Beitrag bearbeitet, um alle Eigenschaften einzuschließen. Kann es über datanucleus.ConnectionFactoryName fehlen? Welchen Wert sollte es haben? – Paul

+1

Konnten Sie genauer auf eine Weise sein, diese Dateien zusammenzuführen? Es ist nicht offensichtlich. – Fabien

+0

@DataNucleus ja, die beste/richtige Weise zu erklären, die Manifest-Dateien zusammenzuführen wäre großartig. Ich kompiliere eine schattierte JAR in einem großen Projekt und es gibt zu viele Dinge, um manuell zusammenzuführen – jtravaglini

2

Um DataNucleus 4 zu verwenden.x In einer Apache Storm-Topologie, die ein einzelnes jar benötigt, musste ich zwei Hacks machen, um ihre PluginRegistry-Funktionen zu erhalten. Das Problem besteht darin, dass der DataNucleus-Core versucht, Module als OSGi-Bundles zu laden, auch wenn er nicht in einem OSGi-Container ausgeführt wird. Dies funktioniert gut, solange die Gläser nicht zusammengeführt werden (und ich möchte meine Abhängigkeiten nicht zusammenführen, aber das ist keine Option für mich).

Zuerst fusionierte ich alle plugin.xml Dateien in die Datanucleus-Core plugin.xml. Der Trick besteht darin, dass Erweiterungspunkt-IDs relativ zur ID ihres übergeordneten Plugins sind. Wenn also eines der von Ihnen verwendeten Module neue Erweiterungspunkte definiert, z. datanucleus-rdbms, müssen Sie die IDs neu schreiben, so dass sie relativ zu ihrem neuen Eltern-Plugin sind.

Zweitens, habe ich die folgenden Einträge in unserem Glas des MANIFEST.MF:

Premain-Class: org.datanucleus.enhancer.DataNucleusClassFileTransformer 
Bundle-SymbolicName: org.datanucleus;singleton:=true 

Diese Lösung nicht ideal, da unsere Anwendung im Wesentlichen täuscht der Datanucleus Kern OSGi-Bundle zu sein. Aber das war es, was ich nach ein paar Tagen mit dem Kopf auf den Schreibtisch schlug.

Es könnte möglich sein, eine andere PluginRegistry-Implementierung zur Verfügung zu stellen, aber ich habe das nicht untersucht.

Verwandte Themen