Как мне управлять ClassPath в WebSphere - PullRequest
7 голосов
/ 09 января 2009

У меня проблема с моим classpath веб-модуля в Websphere v6.1.

В моем WEB-INF / lib у меня большое количество jar-файлов, включая xercesImpl.jar и xmlparserv2.jar. Мне нужны обе банки, но они, похоже, конфликтуют друг с другом. В частности, каждый jar содержит каталог META-INF / services, поэтому, когда мы пытаемся получить экземпляр DocumentBuilderFactory через JAXP, который мы получаем, зависит от порядка, в котором эти два jar появляются в пути к классам.

Я всегда хочу использовать экземпляр xerces DocumentBuildFactory, поэтому я хочу поместить файл xercesImpl.jar в начало пути к классам. Я попытался сделать это, указав раздел Class-Path в файле Manifest для файла war, но путь к классу, который я на самом деле получаю в моем WAS Module Compound CLass Loader, очень странный. Кажется, я получаю некоторые стандартные вещи, которые надевает WAS, затем содержимое библиотеки WEB-INF в алфавитном порядке, а затем путь к классу, указанный в файле манифеста.

Если я вообще не помещаю файл манифеста в войну, я получаю стандартный материал, за которым следует содержимое WEB-INF / lib, но в произвольном порядке.

Чего мне не хватает? Есть ли способ, которым я могу установить путь к классу, чтобы быть именно тем, что я хочу?

Dave

Ответы [ 4 ]

4 голосов
/ 09 января 2009

В IBM Websphere Application Server 6.1 веб-модули имеют свои собственные загрузчики классов, которые обычно используются в режиме PARENT_FIRST. Это означает, что загрузчики классов веб-модуля пытаются передать загрузку классов родительским загрузчикам классов перед загрузкой любых новых классов.

Если вы хотите, чтобы классы Xerces были загружены до классов XML-анализатора v2 (я предполагаю, Oracle XML v2 parser), то классы Xerces должны быть загружены загрузчиком родительского класса - в этом случае, предпочтительно загрузчик классов приложений. Это можно сделать, поместив банку Xerces в корень файла EAR (если он у вас есть) или подготовив файл EAR с файлом xerces.jar и вашим файлом WAR в корне. Затем jar xmlparserv2 должен быть помещен в WEB-INF \ lib.

Вы также можете попытаться создать общую библиотеку Xerces для использования вашим приложением.

Дополнительную информацию об этом можно найти в IBM WebSphere Application Server V6.1: Управление системой и настройка . Подробности доступны в главе 12.

4 голосов
/ 09 января 2009

Полагаю, под WebSphere вы подразумеваете обычный J2EE Application Server (а не что-то вроде Community Edition; WebSphere - это торговая марка, применяемая для ряда продуктов IBM).

Я думаю, что ваши возможности ограничены. Поскольку зависимости выглядят достаточно явно, я бы предпочел программный подход, а не полагаться на капризы пути к классам (например, явно создавать фабричные экземпляры, а не полагаться на SPI).

Если это не вариант, возможно, вы захотите сделать одну из ваших зависимостей утилитой проекта EAR JAR и настроить загрузку классов MODULE с помощью политики загрузки классов PARENT_LAST в WAR. Это можно настроить через консоль администратора браузера (или с помощью инструмента RAD , если вы его используете).

Еще одна вещь, на которую я хотел бы обратить внимание, - это WAS Shared Libraries (в разделе Environment в консоли администратора браузера). Это могут быть , связанные с серверами или приложения . Недостатком является то, что для этого требуется больше настроек.

1 голос
/ 01 марта 2010

Как JAXP выбирает парсеры

Вам может быть интересно, какой парсер на самом деле использует эта программа. В конце концов, JAXP достаточно независим от парсера. Ответ зависит от того, какие парсеры установлены в вашем пути к классам и как установлены определенные системные свойства. По умолчанию используется класс, названный системным свойством javax.xml.parsers.DocumentBuilderFactory. Например, если вы хотите убедиться, что Xerces используется для разбора документов, вы должны запустить JAXPChecker следующим образом:

D:\books\XMLJAVA>java -Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl  JAXPChecker file:///D:/books/xmljava/dom.xml
> file:///D:/books/xmljava/dom.xml is well-formed.

Если свойство javax.xml.parsers.DocumentBuilderFactory не установлено, то JAXP ищет в файле свойств lib / jaxp.properties в каталоге JRE, чтобы определить значение по умолчанию для системного свойства javax.xml.parsers.DocumentBuilderFactory. Если вы хотите последовательно использовать определенный анализатор DOM, например gnu.xml.dom.JAXPFactory, поместите в этот файл следующую строку:

javax.xml.parsers.DocumentBuilderFactory=gnu.xml.dom.JAXPFactory

Если не удается найти анализатор, следующий JAXP ищет файл META-INF/services/javax.xml.parsers.DocumentBuilderFactory во всех JAR-файлах, доступных для среды выполнения, чтобы найти имя конкретного подкласса DocumentBuilderFactory.

Наконец, если это не удается, тогда DocumentBuilderFactory.newInstance() возвращает класс по умолчанию, как правило, анализатор от поставщика, который также предоставил классы JAXP. Например, классы JDK JAXP по умолчанию выбирают org.apache.crimson.jaxp.DocumentBuilderFactoryImpl, а классы flfred JAXP выбирают gnu.xml.dom.JAXPFactory.

0 голосов
/ 10 ноября 2009

Вы также можете попробовать установить системное свойство для предпочтения реализации. например предпочесть xmlparserv2 dom parser, установите javax.xml.parsers.DocumentBuilderFactory = oracle.xml.jaxp.JXDocumentBuilderFactory

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...