2017-01-26 75 views
0

任務創建的JAXBContext:批量處理來轉換數據,並將結果存儲在磁盤上的XML文件。問題OSGI包

問題:編組對象,在OSGI包中加載JAXBContextFactory。 FutureTask中的java.lang.NoClassDefFoundError: org/eclipse/persistence/internal/libraries/asm/ClassWriter引起的死鎖:311。沒有堆棧跟蹤或原因。

問題:爲了讓JAXBContext實例化起作用,我錯過了什麼樣的設置或導入?

說明:

進行數據處理,我需要我的POJO類存儲在磁盤上的XML文件。 POJO類從與填充在分批過程,然後保存到磁盤在那裏將被進一步處理JAXB2-行家-插件(XJC)XSD文件生成。

從不同的堆棧溢出的問題,我瞭解到,OSGI使用不同的類加載器,我必須使用正確的newInstance方法實例化JAXBContext中。 (答案:https://stackoverflow.com/a/1043807/7461710)。

這是我當前的newInstance調用,PrintDocument類位於自動生成的包com.some.package.generated中,ObjectFactory位於同一個包中,也由jaxb2-maven-plugin生成。 在newInstance調用期間,Programm失敗。

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導入包,我已被捆綁的bnd.bnd文件

Import-Package: \ 
    org.eclipse.persistence.jaxb,\ 
    * 

由於JAXB實現我用MOXY。

如果我添加此jaxb.properties文件生成的POJO包:

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中的newInstance調用JAXBContextFactory.createContext,我的單元測試再次工作和PROGRAMM卡在死鎖如上所述由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我應該在jaxb.properties中設置我的JAXBContextFactory包? 'javax.xml.bind.JAXBContextFactory'不工作 – doofmars

回答

0

默認爲com.sun.xml.internal.ws.developer.JAXBContextFactory,但你不應該把它在你的包,因爲它是一個陽光私募包。

而是嘗試在OSGi框架屬性使用此:

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

這將使JAXBContext來找到一個實例化默認JAXBContextImpl。