我的 Eclipse 插件没有找到 JAXB-API 的实现

问题描述

我需要为我的 Eclipse RCP 插件添加 XML 解组功能。我正在使用 JAXB 来处理 XML 文件。如果我从我的 IDE 运行 RCP,这一切都很好。然后我使用 mvn clean package 构建我的插件并使用其 UI 将其安装到我的 RCP。一切顺利,直到我想要我的解组。在我尝试创建 JAXB 上下文的代码中,我收到此异常:

javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
 - with linked exception:
[java.lang.classNotFoundException: com.sun.xml.bind.v2.ContextFactory]
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:232)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:375)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:691)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:632)
at my.code -skip-

互联网告诉我,从 java-11 开始,JDK 禁止使用 JAXB 实现。所以,我需要在我的构建中添加一个。 Maven 依赖项对我不起作用,因为我正在与 Tycho 打交道。我决定从 this location 拿走 com.sun.xml.bind 神器。 我将工件的 ID 放入插件MANIFEST.MF:

-skip-
Bundle-requiredExecutionEnvironment: JavaSE-11
Require-Bundle: org.eclipse.core.runtime;bundle-version="3.14.0",-skip-
 jakarta.xml.bind;bundle-version="2.3.3",com.sun.xml.bind;bundle-version="2.3.3"
-skip-

我也将它添加到目标定义中:

-skip-
  <unit id="com.sun.xml.bind" version="2.3.3.v20201118-1818"/>
<repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20201130205003/repository/"/>
-skip-

环境:

eclipse.buildId=unkNown
java.version=11.0.10
java.vendor=Oracle Corporation
BootLoader constants: OS=win32,ARCH=x86_64,WS=win32,NL=en_US
Command-line arguments:  -os win32 -ws win32 -arch x86_64 -data @noDefault

我尝试在 javax.xml.bind.context.factory=com.sun.xml.bind.v2.JAXBContextFactory 中设置 jaxb.properties。结果一样。 我尝试了 org.eclipse.persistence (Moxy) 的另一个实现。结果是一样的(找不到org.eclipse.persistence.jaxb.JAXBContextFactory)。

我可以在我的 RCP 应用程序的 plugins 文件夹中找到这些工件。为什么我的插件看不到它们?我做错了什么?

解决方法

所以,我的问题在于我想创建上下文的这一行:

JAXBContext ctx = JAXBContext.newInstance(nodeClass);

它抛出了 JAXBException,因为它找不到任何实现。我还没有解决这个问题,但我发现我可以使用对我来说很好的蛮力解决方法。我刚刚用这个替换了这一行:

JAXBContext ctx = ContextFactory.createContext(new Class[] { nodeClass },Collections.<String,Object>emptyMap());

进口:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import com.sun.xml.bind.v2.ContextFactory;

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...