我的 Eclipse 插件未找到 JAXB-API 的实现
Implementation of JAXB-API has not been found by my Eclipse plugin
我需要向我的 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-
Internet 告诉我从 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
我试图在 jaxb.properties
中设置 javax.xml.bind.context.factory=com.sun.xml.bind.v2.JAXBContextFactory
。同样的结果。
我尝试了 org.eclipse.persistence
(Moxy) 的另一个实现。结果是一样的(找不到org.eclipse.persistence.jaxb.JAXBContextFactory
)。
我可以在 plugins
文件夹中的 RCP 应用程序中找到这些工件。为什么我的插件看不到它们?我做错了什么?
所以,我的问题出在我想创建上下文的这一行:
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;
我需要向我的 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-
Internet 告诉我从 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
我试图在 jaxb.properties
中设置 javax.xml.bind.context.factory=com.sun.xml.bind.v2.JAXBContextFactory
。同样的结果。
我尝试了 org.eclipse.persistence
(Moxy) 的另一个实现。结果是一样的(找不到org.eclipse.persistence.jaxb.JAXBContextFactory
)。
我可以在 plugins
文件夹中的 RCP 应用程序中找到这些工件。为什么我的插件看不到它们?我做错了什么?
所以,我的问题出在我想创建上下文的这一行:
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;