2017-01-26 76 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。