7

我正在使用 Oracle 的 OEPE 发行版开发一个 Web 应用程序,包括 Weblogic server 10.3.5。WLS 包括它自己的 Spring 版本,似乎是 2.5.6.SEC01。但是,我们正在尝试使用特定于 3.1 版本的 Spring 和 Spring Security 功能。

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 版本,我到底需要做什么?

4

3 回答 3

6

我有同样的问题。解决方案是在 EAR 项目的 META-INF 文件夹中创建 weblogic-application.xml。这是代码。

<?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 项目。

希望能帮助到你。

于 2012-09-26T00:36:11.993 回答
4

选项 1:将 Spring 3.x 应用程序部署到未安装 JRF 的域中的 wls 服务器。这对我行得通。

选项2:在 weblogic.xml 中使用 prefer-web-inf-classes 并部署为战争。这对我来说适用于 wls 10.3.6、JRF 域、Spring 3.2.2。我无法让prefer-application-packages 工作,但prefer-web-inf-classes 可以。

注意:对于确实安装了 JRF 的域,我尝试了 war/weblogic.xml/prefer-application-packages 和 ear/weblogic-application.xml/prefer-application-packages 方法,但似乎都没有效果。我有一个输出 org.springframework.core.SpringVersion.getVersion() 的测试 jsp,尽管我做出了努力,但它仍然报告 2.5.6.SEC01(这是捆绑在 oracle_common/modules 文件夹中的 Spring 版本)。

但是,在非 JRF 域中部署相同的应用程序,并且 org.springframework.core.SpringVersion.getVersion() 将报告您与应用程序捆绑的任何版本的 spring。

于 2013-07-29T14:36:43.507 回答
2

如果您使用的是 Spring Framework,那么您很可能会将 Spring bean 部署在WAR而不是 EAR 中,即使是 Spring Integration 项目也是如此。最高 12c(包括 12.2.1)没有任何特定配置,您最多只能停留在 Spring 框架 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 框架。

在多服务器域中,不将 JRF 部署到给定的服务器实例不会解决问题,但是没有 JRF 的整个域会解决问题。

诀窍是使用WEB-INF/weblogic.xmlprefer-web-inf-classes部署描述符中的参数,如下所示:

<?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>

并且您可以在带有 JRF 检测的 WebLogic 域中享受 Spring Framework 4.2 的好处。当然,不要忘记将 Spring core 4.2 和相关依赖项包含到 WAR 文件程序集中(即检查构建的 .war 以包含 WEB-INF/lib/spring*.jar)。

于 2015-11-16T17:29:48.443 回答