タスク:データを変換し、XMLファイルとして結果をディスクに格納するバッチ処理。OSGIバンドルでJAXBContextを作成する際の問題
問題:オブジェクトを整列し、JAXBContextFactoryをOSGIバンドルにロードしています。 FutureTaskのjava.lang.NoClassDefFoundError: org/eclipse/persistence/internal/libraries/asm/ClassWriter
によってデッドロックが発生しました:311。スタックトレースまたは原因がありません。
質問:JAXBContextインスタンシエーションを実行するには、どのような設定やインポートが必要ですか?
説明:私は、ディスク上のXMLファイルとして私のPOJOクラスを格納するのに必要なデータ処理のために
。 POJOクラスは、バッチ処理でjaxb2-maven-plugin(xjc)が埋め込まれたxsdファイルから生成され、さらに処理されるディスクに保存されます。
異なるスタックオーバーフローの質問から、私はOSGIが異なるクラスローダーを使用し、正しいnewInstanceメソッドを使用してJAXBContextをインスタンス化する必要があることを知りました。 (回答:https://stackoverflow.com/a/1043807/7461710)。
これは私の現在のnewInstance呼び出しで、PrintDocumentクラスは自動生成パッケージcom.some.package.generated
にあり、ObjectFactoryは同じパッケージ内にあり、jaxb2-maven-pluginによって生成されます。 newInstance呼び出し中にプログラムが失敗します。
JAXBContext jaxbContext = JAXBContext.newInstance(PrintDocument.class.getPackage().getName(),
ObjectFactory.class.getClassLoader());
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
ログファイル:
DEBUG XMLUtil:24 -Step 4/4: Save result into file. path: /somewhere/result.xml
DEBUG bind:282 - Searching jaxb.properties
DEBUG bind:300 - Searching the system property
DEBUG bind:565 - Trying to load org.eclipse.persistence.jaxb.JAXBContextFactory
[no further output]
我々はパッケージをインポートするBNDを使用し、私は私がMOXYを使用するJAXBの実装として
Import-Package: \
org.eclipse.persistence.jaxb,\
*
にバンドル内bnd.bndファイルを設定しています。
私は、生成されたPOJOパッケージに、このjaxb.propertiesファイルを追加した場合:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
通常のクラスが見つからない例外がスローされます。私のユニットテストでさえ。 (ユニットテストは、OSGiバンドルの外でマーシャリングを行い)
javax.xml.bind.JAXBException: Provider org.eclipse.persistence.jaxb.JAXBContextFactory not found
- with linked exception:
[java.lang.ClassNotFoundException: org.eclipse.persistence.jaxb.JAXBContextFactory ]
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:134)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:293)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:431)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:394)
[...]
しかし、私はこの回答https://stackoverflow.com/a/6820113/7461710に基づいてJAXBContextFactory.createContext
へのnewInstanceの呼び出しを変更した場合、私のユニットテストは再び動作し、プログラムの開発がデッドロックに立ち往生上記のようにjava.lang.NoClassDefFoundError: org/eclipse/persistence/internal/libraries/asm/ClassWriter
に起因します。
プロジェクトの依存関係:
<dependency>
<groupId>biz.aQute.bnd</groupId>
<artifactId>biz.aQute.launcher</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.platform</groupId>
<artifactId>org.eclipse.osgi</artifactId>
<version>3.11.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.5</version>
</dependency>
<dependency>
<groupId>org.ops4j.pax.logging</groupId>
<artifactId>pax-logging-api</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>org.ops4j.pax.logging</groupId>
<artifactId>pax-logging-service</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20160810</version>
</dependency>
<dependency>
<groupId>org.zeroturnaround</groupId>
<artifactId>zt-exec</artifactId>
<version>1.9</version>
</dependency>
<dependency>
<groupId>com.io7m.xom</groupId>
<artifactId>xom</artifactId>
<version>1.2.10</version>
</dependency>
<dependency>
<groupId>org.ops4j.pax.jdbc</groupId>
<artifactId>pax-jdbc</artifactId>
<version>0.9.0</version>
<exclusions>
<exclusion>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.compendium</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.ops4j.pax.jdbc</groupId>
<artifactId>pax-jdbc-h2</artifactId>
<version>0.4.0</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.193</version>
</dependency>
<dependency>
<groupId>org.ops4j.pax.jdbc</groupId>
<artifactId>pax-jdbc-oracle</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.core</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>osgi.cmpn</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.scr</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>org.apache.servicemix.bundles</groupId>
<artifactId>org.apache.servicemix.bundles.asm</artifactId>
<version>3.3.1_1</version>
</dependency>
<dependency>
<groupId>org.apache.servicemix.bundles</groupId>
<artifactId>org.apache.servicemix.bundles.saxon</artifactId>
<version>9.7.0-10_1</version>
</dependency>
<dependency>
<groupId>xml-resolver</groupId>
<artifactId>xml-resolver</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.configadmin</artifactId>
<version>1.8.12</version>
</dependency>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.gogo.shell</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.gogo.command</artifactId>
<version>1.0.0</version>
<exclusions>
<exclusion>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.compendium</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.gogo.runtime</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.moxy</artifactId>
<version>2.6.4</version>
</dependency>
私はmoxyの経験はありませんが、jreのJAXBサポートは私にとってうまくいきます。あなたはこれを試しましたか? –
@ChristianSchneider JAXBContextFactoryをjaxb.propertiesにどのようなパッケージに設定する必要がありますか? 'javax.xml.bind.JAXBContextFactory'は機能しません – doofmars