Мне нелегко выяснять, куда проблема возникает из, таким образом, я отправляю это в надеждах, что другие, возможно, нашли что-то подобным этому в другом месте и достаточно любезны для совместного использования их понимания.
Я использую JBoss 5.0.1. Сервер приложений GA, работающий сверху Java Sun 1.6.0-13 JDK. Для ВОЕННОГО файла в сгенерированном веб-сервисе я использую механизм Axis2 1.4 WS, файлы JAR которого вставляются Eclipse Galileo в проект WEB-INF/lib
каталог при создании Веб-сервиса из данного класса "рабочего" в Динамическом веб-проекте. Отрывок соответствующих норм следует:
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, имеет различные Объекты класса для того типа
Я мог использовать XPath.evaluate(String,Document)
— однако существуют случаи, где я должен добраться (например), a XPathConstants.NODESET
вместо этого, таким образом, это - остановка. Я также попытался возиться немного путем замусоривания некоторых jboss-web.xml
файлы тут и там в ВОЕННОМ файле, но без эффекта.
То, что я пытаюсь понять:
rt.jar
);$JBOSS_HOME/lib/endorsed/stax-api.jar
); и $JBOSS_HOME/server/deploy/MyProject.ear/MyProject.war/WEB-INF/lib/axis2-saaj-api-1.4.jar
и woden-impl-dom-1.0M8.jar
).jaxax.xml.namespace.QName
вызывает горе.Заранее спасибо.
Кажется, проблема была решена путем удаления пакет javax.xml.namespace. *
и соответствующие классы из развернутых файлов Axis2 JAR. А именно, используя 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). Я не знаю, почему это происходит, я полагаю, что динамический веб-модуль версии 2.4, по умолчанию связанный с Java 1.4 в Eclipse, является источником всей путаницы. Некоторые поисковые запросы привели меня к мысли, что пакет javax.xml не был включен в JDK до Java 5 или Java 6 - отсюда и возможная путаница! Однако я недостаточно осведомлен, чтобы исследовать, связана ли проблема с тем, как Eclipse упаковывает архивные файлы для развертывания, так что это всего лишь подозрение, которое у меня есть.
JBoss выдаст ошибку LinkageError
, когда путь к классам приложения содержит классы, которые JBoss считает «защищенными», т.е. не позволяет приложению содержать собственные копии определенных ключевых API.
В этом случае похоже, что ваше приложение содержит собственные копии javax.xml.xpath
API и, возможно, некоторые другие, как вы упомянули.
Вам необходимо удалить из каталогов ваших EAR / WAR lib все, что конфликтует с собственными библиотеками JBoss (например, axis2-saaj-api-1.4.jar
).