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).