任務創建的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>
我沒有與MOXY經驗,但是從JRE的JAXB支持正常工作對我來說。你試過這個嗎? –
@ChristianSchneider我應該在jaxb.properties中設置我的JAXBContextFactory包? 'javax.xml.bind.JAXBContextFactory'不工作 – doofmars