класс Java с помощью jaxb API, переставший работать в jira с: Поставщик com.sun.xml.bind.v2. ContextFactory, не найденный

Я пишу плагин для Jira, который включает парсинг XML-документов. Я использую JAXB, чтобы сделать так (XML к pojos и наоборот) Также - класс, который генерирует XML от pojos, использующего JAXB., на который он похож...

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', это работает правильно. но, когда я упаковываю его как банку и помещаю его как плагин в 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, это не называет основное (), но m1 () путем инстанцирования.

Я задаюсь вопросом, что происходит! это находится на той же машине. я не знаю, как Jira запускает приложение (поскольку я запускаюсь из командной строки).

5
задан tshepang 20 February 2014 в 06:44
поделиться

2 ответа

Пакет com.sun.xml.bind является частью JAXB RI ( http://jaxb.dev.java.net/ ), так что, вероятно, у вас есть это где-то в вашем пути к классам.

Java6 имеет собственную версию JAXB, включенную в пакет com.sun.xml.internal.bind , поэтому обычно RI в Java6 не требуется.

RI можно заставить работать с Java6, но это тяжелая битва, и обычно возникают проблемы такого рода.

0
ответ дан 13 December 2019 в 19:21
поделиться

Наконец-то я смог выяснить причину.

При загрузке подключаемых модулей в JIRA (Felix) задействовано множество загрузчиков классов . который не будет делегировать "bootstrap" ClassLoader . Отсюда и проблема.

Чтобы узнать, какой ClassLoader загрузил класс JAXBContext , используйте JAXBContext.class.getClassLoader () , который напечатает некоторый 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, который примет другой параметр как ClassLoader .

Это заняло довольно много времени. Но меня удивляют внутренние детали и мое невежество

5
ответ дан 13 December 2019 в 19:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: