2016-06-02 4 views
1

Справочная информация: У меня есть следующая проблема: у меня есть несколько файлов WAR, которые необходимо развернуть на одном сервере Websphere. Файлы WAR используют библиотеки, зависящие от того, что определенная версия XMLSec зарегистрирована как поставщик подписи XML (с классом безопасности Java). В настоящее время я связываю эту библиотеку с каждым файлом WAR (так как файлы WAR также должны работать автономно и на Tomcat без какой-либо специальной общей библиотеки и т. Д.). Каждый файл WAR регистрирует поставщика с помощью Security.addProvider() в ServerContextListener. Но это вызывает проблемы в настройке multi-WAR, потому что, если один WAR-файл выполняет регистрацию с помощью Security.addProvider), а другие WAR-файлы пытаются извлечь его с помощью класса XMLSignatureFactory (который на самом деле является классом javax. *, Содержащимся внутри XMLSec JAR сам, но который, в конечном счете, обращается к глобальному списку поставщиков, настроенному с помощью Security.addProvider), тогда он вызывает ClassCastException внутри XMLSignatureFactory, потому что этот класс выполняет бросок того, что он получает от Security, до собственной версии классов провайдера, что не работает. Точный трассировки стека выглядит следующим образом:Websphere: Общие библиотеки в общем классе loader ранее на пути к классам, чем модули приложений, даже с родительской последней политикой

Вызванный: java.lang.ClassCastException: org.apache.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory несовместимы с javax.xml.crypto.dsig. XMLSignatureFactory на javax.xml.crypto.dsig.XMLSignatureFactory.findInstance (XMLSignatureFactory.java:202) на javax.xml.crypto.dsig.XMLSignatureFactory.getInstance (XMLSignatureFactory.java:292)

К так это не конфликт с различными версиями XMLSec, которые находятся в игре или конфликтами h Собственная версия Websphere. Существует только одна версия, хотя она загружается из разных WAR.

Конечно, решение состоит в том, чтобы библиотека xmlsec была загружена с помощью обычного загрузчика классов, так что есть только одна версия классов, загружаемых всеми файлами WAR, что позволило бы избежать ClassCastExceptions и т. Д. Но здесь есть rub: I также необходимо, чтобы каждое приложение загружалось с «родительской последней» политикой - точнее, мне нужно, чтобы файлы JAR внутри каждого приложения имели приоритет над встроенной версией библиотек Websphere (например, Axis2, которую я также включаю в набор файлов WAR .). Furter, я бы предпочел, чтобы я мог хранить библиотеку xmlsec в каждой папке WEB-INF/lib в WAR-файлах, чтобы файлы WAR все равно могли работать автономно (т.е. в других средах, которые могут не иметь настроенной общей библиотеки и т. Д.).).

Так что я хочу иметь общий загрузчик классов, загружающий библиотеку XMLSec, скажем, где-то с диска. Обозначим это [SHARED XMLSEC]. Тогда я хочу каждое приложение классам, чтобы в конечном итоге выглядеть следующим образом:

App1: [ШАРЕД XMLSEC] [App1 WEB-INF/Lib] [библиотеки Websphere] [библиотеки JDK]

App2: [ШАРЕД XMLSEC] [App2 WEB-INF/Lib] [библиотеки Websphere] [библиотеки JDK]

т.д.

В такой конфигурации не имеет значения, если сами App1 + App2 содержат библиотеку XMLSec, так как общий один будет иметь приоритет, поэтому они будут использовать общий. В то же время App1 + App2 по-прежнему может переопределить другие встроенные библиотеки Websphere (Axis2).

Возможно ли реализовать эту конфигурацию и какие параметры мне нужно установить? Вы видите альтернативные пути достижения одной и той же цели?

+0

Если ваша библиотека не конфликтует с файлами WAS, вы можете попытаться поместить банки в каталог 'AppServer \ lib \ ext'. Это нехорошее решение, но в этом случае библиотека будет загружаться сервером и распространяться среди приложений, поэтому, возможно, это сработает для вас. – Gas

+0

Он не конфликтует с файлами WAS, но я бы предпочел также иметь классы в отдельных файлах WAR, и это не сработает, поскольку JAR в файлах WAR будет иметь приоритет над теми, что содержатся в lib \ ext, разрушая решение (поскольку каждое приложение все равно будет видеть свою собственную копию XMLSignatureFactory). – Morty

+0

Либо вы хотите загрузить общую библиотеку уровня сервера, либо сначала загрузите классы, загруженные из военных файлов с родительским. Некоторые другие настройки, которые вы можете попробовать - 1) сконфигурировать разделяемую библиотеку с первоначальной настройкой родителя и использовать родительский последний в приложении или 2) использовать один загрузчик классов для всего сервера (если у вас нет противоречивых банок между приложениями), 3) удалите эти xml из приложений и использовать их только в общей библиотеке. – Gas

ответ

0

Поскольку у вас есть конфликт между классами здесь, я бы посоветовал перейти к отдельным загрузчикам классов для каждого приложения. На стороне сервера установка политики загрузчика классов в «Несколько» должна обеспечивать изоляцию между приложениями.

Как только у вас есть этот набор, настройте загрузку классов на уровне приложения в конфигурацию «Родительская последняя» для обоих приложений.

Следующая ссылка Центр знаний имеет соответствующие инструкции [Steps 2,3 & 4 в разделе «Порядок действий»]: http://www.ibm.com/support/knowledgecenter/en/SSAW57_8.5.5/com.ibm.websphere.nd.multiplatform.doc/ae/trun_classload.html

[Примечание: версия WAS используется не указано в вопросе. Ссылка на Центр знаний относится к версии 8.5.5.]

+0

Привет, но это не конфликт в версии классов - просто важно, чтобы класс, рассматриваемый в пути к классам каждого приложения, соответствовал тому, который зарегистрирован в Security.addProvider() (поскольку только один может быть зарегистрирован). Если я использую изолированный загрузчик классов, это также означает, что приложения будут видеть разные версии списка Security.addProvider()? – Morty

+0

@Morty Честно говоря, я не могу помочь вам отладить приложение на подробном уровне, главным образом потому, что у меня нет большого опыта со стороны разработчиков. Тем не менее, ваши классы в каждом WAR-файле должны работать независимо друг от друга при использовании изолированных загрузчиков классов. Вам нужно попробовать это и посмотреть, разрешит ли он ваш конкретный случай. – Haxiel

+0

Да, они работают независимо, но основной класс безопасности является общим. На мой взгляд, проблема возникает из-за того, что XMLSec содержит свой собственный javax «XMLSignatureFactory» и связанные классы и т. Д. (Что действительно необходимо, поскольку они не являются частью используемой нами версии Websphere), но эти же классы запрашивают базовый интерфейс безопасности который является общим. Это означает, что, когда этот JAR связан с приложением в конфигурации «родительская последняя», различные приложения видят свой собственный класс XMLSignatureFactory. Это было бы нормально, если бы это было не так ... – Morty

 Смежные вопросы

  • Нет связанных вопросов^_^