有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

我的Eclipse插件尚未找到JAXBAPI的java实现

我需要将XML解组功能添加到我的Eclipse RCP插件中。我正在使用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依赖对我不起作用,因为我在和第谷打交道。我决定从this location中获取com.sun.xml.bind工件。 我将工件的ID放入插件的^{

-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)的实现。结果是一样的(找不到^{

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


共 (1) 个答案

  1. # 1 楼答案

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

    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;