5

組み込みH2データベース用にDatanucleusとJDOを使用してデスクトップアプリを開発しています。Eclipseから実行するとすべて正常に動作しますが、実行可能jarを作成しようとすると動作を停止します。次のエラーが発生します:

org.datanucleus.exceptions.NucleusUserException:「jdo」という名前のClassLoaderResolverを使用するように永続プロセスが指定されましたが、これはDataNucleusプラグインメカニズムによって検出されませんでした。CLASSPATHとプラグインの仕様を確認してください。

もちろん、それは私が何かを適切に構成していないことを示しています-私は何が欠けていますか?何か大きなものが欠けていたら、それはまったく機能しないので、欠陥のある実行可能jarであると想定しています。私はそれが修正されたJPOXのような他のアプリでそのエラーを見ましたが、解決策は与えられていません。

エラースタックトレース全体:

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

それが指す行は、PersistenceManagerFilterinitメソッドです。

pmf = JDOHelper.getPersistenceManagerFactory(getProperties());

プロパティファイルは次のようになります。

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

依存関係を使用してデプロイすることを目標として、Mavenからのすべての依存関係があります。依存関係は、datanucleusページhttp://www.datanucleus.org/products/datanucleus/jdo/maven.htmlに記載されているとおりです。

何か案は?

4

4 に答える 4

6

DataNucleus jarはすべてOSGi対応であり、プラグインメカニズムを使用して機能を識別するため、plugin.xmlファイルとMETA-INF/MANIFEST.MFファイルが含まれています。これらは、元のDN jar(jarのルートから)と同じ場所にある必要があります。解凍してから再jarする場合は、DNjarからplugin.xmlとMETA-INF/MANIFEST.MFをマージする必要があります...一部の情報だけでなく、すべての情報が含まれています。

于 2012-04-11T12:58:35.657 に答える
2

DataNucleusの答えに追加します。
必要なものを実現するには、maven-dependency-plugin
を使用 して、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>

次に、依存関係はtarget/jarsディレクトリにあります。

アプリを実行するには、次のコマンドを使用します

。Windows:
java -cp "yourFile.jar; jars / *" package.className

Linux:
java -cp "yourFile.jar:jars / *" package.className

注:jars/*は使用しないでください。 .jar、これは機能しません

于 2012-04-13T08:02:16.667 に答える
2

単一のjarを必要とするApacheStormトポロジでDataNucleus4.xを使用するには、PluginRegistryを機能させるために2つのハックを実行する必要がありました。問題は、DataNucleusコアがOSGiコンテナーで実行されていない場合でも、モジュールをOSGiバンドルとしてロードしようとすることです。これは、jarがマージされない限り正常に機能します(依存関係をマージしたくないのですが、これは私にとってのオプションではありません)。

まず、すべてのplugin.xmlファイルをdatanucleus-coreplugin.xmlにマージしました。秘訣は、拡張ポイントIDが親プラグインのIDに相対的であるということです。したがって、使用しているモジュールのいずれかが新しい拡張ポイント(datanucleus-rdbmsなど)を定義している場合は、新しい親プラグインを基準にするようにIDを書き直す必要があります。

次に、jarのMANIFEST.MFに次のエントリを追加しました。

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

私たちのアプリケーションは本質的にDataNucleusコアOSGiバンドルのふりをしているため、このソリューションは理想的ではありません。しかし、これは私が机の上で頭を打ち砕いた数日後に私が最終的に得たものでした。

別のPluginRegistry実装を提供することは可能かもしれませんが、私はこれを調べていません。

于 2014-11-20T01:16:20.297 に答える
0

datanucleus plugin.xmlファイルをマージするのに苦労している他の人のために、私は次のコードを使用して支援しました。このコマンドを使用して、3つの別々のdatanucleus plugin.xmlファイルからコンテンツをパイプします。これにより、明示的にマージする必要のある拡張機能がある場所がわかります。

cat plugin_core.xml plugin_rdbms.xml plugin_api.xml | grep -h "extension point" | tr -d "[:blank:]"| sort | uniq -d

詳細は別の投稿にあります。

于 2020-06-28T20:12:27.830 に答える