Weblogic 10.3.5 Переопределяющая версия Spring

Я занимаюсь разработкой веб-приложения с использованием дистрибутива Oracle OEPE, включая сервер Weblogic 10.3.5. WLS включает свою собственную версию Spring, которая выглядит как 2.5.6.SEC01. Однако мы пытаемся использовать функции Spring и Spring Security, характерные для версии 3.1.

Maven POM определяет версию Spring как свойство 3.1.1.RELEASE (с этим свойством, подключенным к разделам, то есть:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
</dependency>

Я попробовал два отдельных способа в weblogic.xml - исключить встроенный Spring (один закомментирован ниже, но будьте уверены, я пробовал оба):

<wls:container-descriptor>
    <wls:prefer-application-packages>
        <wls:package-name>com.oracle.ojdbc16.*</wls:package-name>
        <wls:package-name>antlr.*</wls:package-name>
        <wls:package-name>javax.persistence.*</wls:package-name>
        <wls:package-name>org.apache.commons.*</wls:package-name>
        <wls:package-name>org.springframework.*</wls:package-name>
        <wls:package-name>org.hibernate.*</wls:package-name>
        <wls:package-name>org.apache.xerces.*</wls:package-name>
    </wls:prefer-application-packages>
    <!-- <wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes> -->
</wls:container-descriptor>

Что в мире я должен сделать, чтобы использовать мою собственную версию Spring?

3 ответа

Решение

ВАРИАНТ 1: Разверните приложение Spring 3.x на сервере wls в домене, в котором не установлен JRF. Это подходит для меня.

ВАРИАНТ 2: используйте предпочитаемый-web-inf-классы в weblogic.xml и разверните как войну. У меня это работало с wls 10.3.6, домен JRF, Spring 3.2.2. Я не мог заставить работать предпочтительные пакеты приложений, но предпочел-веб-inf-классы.

ЗАМЕЧАНИЯ. В домене, на котором установлена ​​JRF, я попробовал подходы war/weblogic.xml/ предпочитаемое-приложение и ear/weblogic-application.xml/ предпочитаемое-приложение, но ни один из них не кажется эффективным. У меня есть тестовый jsp, который выводит org.springframework.core.SpringVersion.getVersion(), и он продолжает сообщать о 2.5.6.SEC01, несмотря на мои усилия (это версия Spring, связанная в папке oracle_common/modules).

Разверните это же приложение в домене, отличном от JRF, и org.springframework.core.SpringVersion.getVersion() сообщит о любой версии Spring, которую вы поставили в комплекте с вашим приложением.

У меня такая же проблема. Решением было создать файл weblogic-application.xml в папке META-INF проекта EAR. Вот код

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application>
    <prefer-application-packages>
        <package-name>org.apache.*</package-name>
        <package-name>org.springframework.*</package-name>
    </prefer-application-packages>
</weblogic-application>

Может быть, ваша проблема в том, что вы используете weblogic.xml в проекте WAR вместо weblogic-application.xml в проекте EAR.

Надеюсь, поможет.

Если вы используете Spring Framework, вы, скорее всего, будете развертывать компоненты Spring в WAR, а не EAR, даже в случае проекта Spring Integration. До 12c (включая 12.2.1) без какой-либо конкретной конфигурации вы застрянете в Spring Framework 3.0.5 и Spring Integration 2.2.6 в лучшем случае. Любая попытка использовать более высокую версию Spring, скорее всего, приведет к развертыванию:

weblogic.application.ModuleException: java.lang.NoSuchMethodError: org.springframework.core.MethodParameter.getNestedParameterType()Ljava/lang/Class;

потому что встроенная в Oracle-JRF Spring Framework выбирается загрузчиком классов.

В домене с несколькими серверами отказ от развертывания JRF на конкретном экземпляре сервера не решит проблему, но подойдет целый Домен без JRF.

Хитрость заключается в том, чтобы использовать prefer-web-inf-classes параметр в дескрипторе развертывания WEB-INF/weblogic.xml, а именно:

<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.8/weblogic-web-app.xsd">
    <wls:container-descriptor>
        <wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>
    </wls:container-descriptor>
</wls:weblogic-web-app>

и вы можете воспользоваться преимуществами Spring Framework 4.2 в домене WebLogic с помощью инструментария JRF. Не забудьте, конечно, включить Spring core 4.2 и связанные с ним зависимости в сборку файла WAR (т. Е. Проверить, что встроенный.war содержит WEB-INF/lib/spring*.jar).

Другие вопросы по тегам