Мне трудно понять, откуда возникла проблема, поэтому я публикую это в надежде, что другие могут найти что-то подобное в другом месте и достаточно любезны, чтобы поделиться своим пониманием.
Я использую сервер приложений 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
вызывает горе.
Заранее спасибо.