Как мне управлять путем к классу в WebSphere

StackOverflow https://stackoverflow.com/questions/427837

  •  06-07-2019
  •  | 
  •  

Вопрос

У меня проблема с моим путем к классу веб-модуля в Websphere версии 6.1.

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

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

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

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

Дэйв

Это было полезно?

Решение

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

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

Если это не вариант, вы можете рассмотреть возможность создания одной из ваших зависимостей в EAR project utility JAR и настроить загрузку классов МОДУЛЯ с помощью политики загрузки классов PARENT_LAST в WAR.Это можно настроить через консоль администратора браузера (или через РАД инструмент, если вы им пользуетесь).

Еще одна вещь, на которую я бы обратил внимание, - это БЫЛ Разделяемые библиотеки функция (под Окружающая среда в консоли администратора браузера).Это могут быть связанный с серверами или приложения.Недостатком является то, что для этого требуется дополнительная настройка.

Другие советы

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

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

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

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

Как 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 по умолчанию, но классы Эльфреда ДЖАКСПА выбирают gnu.xml.dom.JAXPFactory вместо этого.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top