5

我正在为 Jira 编写一个涉及 XML 文档解析的插件。我正在使用 JAXB 这样做(XML 到 pojos,反之亦然)所以有一个使用 JAXB 从 pojos 生成 XML 的类。看起来像...

import javax.xml.bind.*;

Class Parser {
  public void m1() {
    ...
    // code which uses classes in javax.xml.bind.*
  }

  public static void main(String args[]){
   Parser p=new Parser();
   p.m1();

  } 
}

提到的软件包将随 JDK 发行版 (rt.jar) 一起提供。所以我没有转播其他任何内容来运行课程。

当我使用“java”从命令行启动它时,它工作正常。但是,当我将它打包为 jar 并将其作为插件放入 Jira 时,它失败并出现以下错误

javax.xml.bind.JAXBException: Provider com.sun.xml.bind.v2.ContextFactory not found
 - with linked exception:
[java.lang.ClassNotFoundException: com.sun.xml.bind.v2.ContextFactory]
        at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:152)
        at javax.xml.bind.ContextFinder.find(ContextFinder.java:299)
        at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:372)
        at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:337)

这是在同一台机器上。我能看到的唯一区别与从命令行启动不同,当我在 Jira 中部署它时,它不是通过实例化调用 main() 而是 m1()。

我想知道发生了什么!它在同一台机器上。我不知道 Jira 如何启动应用程序(因为我从命令行启动)。

4

3 回答 3

6
于 2012-05-08T10:49:46.923 回答
5

最后我能够找出原因。

ClassLoaders在 JIRA (Felix) 中加载插件时涉及很多。这不会委托给 'bootstrap' ClassLoader。因此问题。

要知道哪个ClassLoader加载了JAXBContext类,使用JAXBContext.class.getClassLoader()which 将打印一些 Felix ClassLoader

jaxb-api.jar它从而不是依赖加载类,rt.jar但它们实现的类略有不同。 rt.jar版本使用 com.sun.xml.bind.internal.v2.ContextFactory哪里jaxb-api版本使用com.sun.xml.bind.v2.ContextFactory

我可以使用 JAXB 的 overlaoded 方法解决这个问题,该方法将另一个参数作为ClassLoader.

花了相当长的时间。但是,我对内在细节和我的无知感到惊讶

于 2010-06-24T11:52:34.733 回答
0

com.sun.xml.bind包是 JAXB RI ( http://jaxb.dev.java.net/ ) 的一部分,因此您可能在某个地方的类路径中有它。

Java6 在com.sun.xml.internal.bind包中包含自己的 JAXB 版本,因此您通常不需要 Java6 中的 RI。

可以使RI与 Java6 一起使用,但这是一场艰苦的战斗,并且通常以此类问题告终。

于 2010-06-23T08:05:46.447 回答