Я пишу плагин для 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 запускает приложение (поскольку я запускаюсь из командной строки).
Пакет com.sun.xml.bind
является частью JAXB RI ( http://jaxb.dev.java.net/ ), так что, вероятно, у вас есть это где-то в вашем пути к классам.
Java6 имеет собственную версию JAXB, включенную в пакет com.sun.xml.internal.bind
, поэтому обычно RI в Java6 не требуется.
RI можно заставить работать с Java6, но это тяжелая битва, и обычно возникают проблемы такого рода.
Наконец-то я смог выяснить причину.
При загрузке подключаемых модулей в 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
.
Это заняло довольно много времени. Но меня удивляют внутренние детали и мое невежество