2017-01-26 7 views
0

タスク:データを変換し、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> 
+0

私はmoxyの経験はありませんが、jreのJAXBサポートは私にとってうまくいきます。あなたはこれを試しましたか? –

+0

@ChristianSchneider JAXBContextFactoryをjaxb.propertiesにどのようなパッケージに設定する必要がありますか? 'javax.xml.bind.JAXBContextFactory'は機能しません – doofmars

答えて

0

デフォルトはcom.sun.xml.internal.ws.developer.JAXBContextFactoryですが、それは太陽プライベートパッケージであるとして、あなたのバンドルでそれを設定しないでください。

代わりにあなたのOSGiフレームワークのプロパティでこれを使用しよう:

org.osgi.framework.bootdelegation=com.sun.* 

これはJAXBContextのインスタンス化をデフォルトJAXBContextImplを見つけることができるようになります。

関連する問題