Разрешение класса XPath в JBoss5 - PullRequest
8 голосов
/ 14 июля 2010

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

Я использую сервер приложений JBoss 5.0.1.GA , работающий поверх Sun Java 1.6.0-13 JDK . Для файла WAR в сгенерированной веб-службе я использую движок Axis2 1.4 WS, JAR-файлы которого вставляются Eclipse Galileo в каталог WEB-INF/lib проекта при создании веб-службы из данный «рабочий» класс в Dynamic Web Project. Ниже приведен соответствующий фрагмент кода:

String sUrl = "http://example.com/datafile.xml";
String sPath = "/some/xpath/string";
InputStream input = new URL(sUrl).openStream();
InputSource source = new InputSource(input);
DocumentBuilderFactory docFact = DocumentBuilderFactory.newInstance();
docFact.setNamespaceAware(false);
DocumentBuilder parser = docFact.newDocumentBuilder();
Document doc = parser.parse(source);
XPath xpath = XPathFactory.newInstance().newXPath();
// error occurs here:
String result = (String) xpath.evaluate(path,doc,XPathConstants.STRING);
input.close();

Это ошибка, которую я получаю из журнала JBoss:

java.lang.LinkageError: нарушение ограничения загрузчика: при разрешении поля «STRING» загрузчик класса (экземпляр org / jboss / classloader / spi / base / BaseClassLoader) ссылающегося класса, javax / xml / xpath / XPathConstants, и загрузчик классов (экземпляр ) для разрешенного типа поля, javax / xml / namespace / QName, имеет разные объекты Class для этого типа

I может использовать XPath.evaluate(String,Document) & mdash; однако есть случаи, когда мне нужно получить (например) XPathConstants.NODESET вместо этого, так что это не пойдет. Я также попытался немного покопаться, засоряя некоторые jboss-web.xml файлы здесь и там в файле WAR, но безрезультатно.

Я пытаюсь понять:

  • Откуда может исходить ошибка? Загрузчик класса JBoss? Какое-то странное взаимодействие между JBoss и Sun JDK? Какая-то странность, представленная Eclipse при создании веб-службы? Может быть, какая-то путаница, внесенная библиотеками Axis2, развернутыми в WAR?
  • Я нашел экземпляры скомпилированных файлов классов в том, что выглядит как тройной удар:
    • Sun JDK (файл rt.jar);
    • библиотеки JBoss ($JBOSS_HOME/lib/endorsed/stax-api.jar); и
    • Развернутые Axis2 библиотеки ($JBOSS_HOME/server/deploy/MyProject.ear/MyProject.war/WEB-INF/lib/axis2-saaj-api-1.4.jar и woden-impl-dom-1.0M8.jar).
  • Как именно я должен настроить JBoss, чтобы он сообщал ему, из каких классов можно загружать файлы из "других" библиотек? В частности, jaxax.xml.namespace.QName вызывает горе.

Заранее спасибо.

Ответы [ 2 ]

7 голосов
/ 14 июля 2010

JBoss выдаст LinkageError, когда путь к классам приложения содержит классы, которые JBoss считает «защищенными», то есть он не позволяет приложению содержать собственные копии определенных ключевых API.

В этом случаепохоже, что ваше приложение содержит свои собственные копии javax.xml.xpath API, а также, возможно, некоторые другие, как вы упомянули.

Вам необходимо удалить что-либо из lib-каталогов EAR / WAR, конфликтующих с собственными библиотеками JBoss(например, axis2-saaj-api-1.4.jar).

4 голосов
/ 22 июля 2010

Похоже, что проблема была решена путем удаления пакета javax.xml.namespace.* и соответствующих классов из развернутых файлов JAR Axis2. А именно, используя Axis2 1.4.1 (вместо 1.4), я переупаковал эти файлы JAR:

  • axis2-saaj-api-1.4.1.jar, удалив javax.xml.namespace
  • woden-impl-dom-1.0M8.jar, путем удаления javax

Кроме того, Eclipse чрезвычайно требователен к конфигурации проекта. До сих пор я обнаружил, что аспект проекта для динамического веб-проекта имеет , который должен быть создан с помощью динамического веб-модуля версии 2.4 (а не 2.5, как предлагается по умолчанию) , но с версией Java 6 (такой же, как ветвь используемого JDK). Я не знаю, почему это происходит, я предполагаю, что Dynamic Web Module версии 2.4, связанный по умолчанию с Java 1.4 в Eclipse, является источником всей путаницы. Некоторое гугление заставило меня поверить, что пакет javax.xml не включался в JDK до Java 5 или Java 6 - отсюда и возможное смешение! Тем не менее, я недостаточно осведомлен, чтобы выяснить, возникает ли проблема из-за того, как Eclipse упаковывает архивные файлы для развертывания, так что у меня пока есть только подозрения.

...