【问题标题】:Weblogic 10.3.5 Overriding Spring VersionWeblogic 10.3.5 覆盖 Spring 版本
【发布时间】:2012-07-13 16:21:05
【问题描述】:

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

【问题讨论】:

    标签: spring weblogic


    【解决方案1】:

    我遇到了同样的问题。解决方案是在 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>
    

    也许您的问题是您在 WAR 项目中使用 weblogic.xml,而不是在 EAR 项目中使用 weblogic-application.xml。

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      选项 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。

      【讨论】:

      • 我们确定我们不需要 JRF,诅咒 Oracle,继续我们的业务。
      【解决方案3】:

      如果您使用的是 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.xml 部署描述符中使用 prefer-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 的好处。 当然,不要忘记在 WAR 文件程序集中包含 Spring core 4.2 和相关依赖项(即检查构建的 .war 以包含 WEB-INF/lib/spring*.jar)。

      【讨论】:

        猜你喜欢
        • 2012-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-20
        • 1970-01-01
        • 2019-03-04
        相关资源
        最近更新 更多