簡體   English   中英

在 OSGI Bundle 中創建 JAXBContext 的問題

[英]Problems creating JAXBContext in OSGI Bundle

任務:批處理轉換數據並將結果作為 XML 文件存儲在磁盤上。

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

問題:為了讓 JAXBContext 實例化工作,我錯過了什么樣的設置或導入?

解釋:

對於數據處理,我需要將我的 POJO 類作為 XML 文件存儲在磁盤上。 POJO 類是從 xsd 文件生成的,其中 jaxb2-maven-plugin (xjc) 在批處理中填充,然后保存到磁盤,在那里將進一步處理。

從一個不同的 Stack Overflow 問題我了解到 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 來導入包,我已經將 bundle 中的 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)
    [...]

但是,如果我根據此答案將 newInstance 調用更改為JAXBContextFactory.createContext https://stackoverflow.com/a/6820113/7461710 ,則我的單元測試再次工作,並且程序陷入由java.lang.NoClassDefFoundError: org/eclipse/persistence/internal/libraries/asm/ClassWriter引起的死鎖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>

默認值為com.sun.xml.internal.ws.developer.JAXBContextFactory但您不應在您的包中設置它,因為它是一個 sun 私有包。

而是嘗試在您的 OSGi 框架屬性中使用它:

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

這將允許 JAXBContext 找到一個實例化默認的 JAXBContextImpl。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM