Spring应用在Weblogic 12c上部署失败

5
我的Spring应用程序在Weblogic 11g上部署良好。但是,当我尝试在Weblogic 12c上进行部署时,我不断遇到一个接一个的ClassNotFoundException。
首先,我遇到了java.lang.ClassNotFoundException: com.querydsl.core.types.Expression,通过添加缺少的依赖项来解决了这个问题。然后我遇到了相似的异常,但这次缺少的类来自包com.mysema.querydsl。引入此依赖项后,我遇到以下异常:java.lang.ClassNotFoundException: org.apache.abdera.writer.Writer。
为什么迁移到Weblogic 12c后应用程序会完全崩溃(因为Spring不应与容器耦合起来)?
以下是迁移前项目的所有依赖项:
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <spring.version>4.3.2.RELEASE</spring.version>
    <spring-data-jpa.version>1.10.2.RELEASE</spring-data-jpa.version>
    <spring-security.version>4.1.3.RELEASE</spring-security.version>
    <cxf.version>3.1.7</cxf.version>
    <jackson.version>1.9.13</jackson.version>
    <esapi.version>2.1.0.1</esapi.version>
    <hibernate-entitymanager.version>5.1.1.Final</hibernate-entitymanager.version>
    <hibernate-commons-annotations.version>5.0.1.Final</hibernate-commons-annotations.version>
    <spring-boot-starter-jdbc.version>1.5.2.RELEASE</spring-boot-starter-jdbc.version>
    <slf4j.version>1.7.21</slf4j.version>
    <log4j.version>1.2.17</log4j.version>
    <log.directory>logs</log.directory>
</properties>

<dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>3.0-alpha-1</version>
        </dependency>

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

        <!-- Security -->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-core</artifactId>
            <version>${spring-security.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>${spring-security.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>${spring-security.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-acl</artifactId>
            <version>${spring-security.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-ldap</artifactId>
            <version>${spring-security.version}</version>
        </dependency>
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>2.2.0</version>
        </dependency>


        <!-- DB -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>${spring-data-jpa.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-jdbc</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-orm</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>${hibernate-entitymanager.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.common</groupId>
            <artifactId>hibernate-commons-annotations</artifactId>
            <version>${hibernate-commons-annotations.version}</version>
        </dependency>

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

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- DB end -->

        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>
        <!-- Oracle JDBC -->
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc7</artifactId>
            <version>12.1.0.1.0</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
    </dependencies>

你能否添加 <properties/> 部分以包含依赖项的版本号? - pirho
顺便问一下:<artifactId>servlet-api</artifactId> 为什么默认是 <scope/> 而不是 <scope>provided</scope> - pirho
我更新了问题,包括版本信息。 - Tuomas Toivonen
看一下这个链接:https://community.oracle.com/thread/4043371 也许对你有帮助。 - bpjoshi
3个回答

3

2
一般问题是Weblogic有很多库打包在一起。当应用程序部署时,类加载器可能会从Weblogic中打包的库加载,也可能会从应用程序中加载。
Weblogic 12c有额外的库打包,因此可能会抛出异常,因为该jar包含旧版本的相同库,并且某些类/方法可能不存在于该jar中。
解决方法是部署EAR,将WAR文件打包并指定首选库。这样,您的库将被加载,而不是Weblogic的旧版本。
要部署EAR,您需要创建一个新的Maven模块,使用ear打包,并包含weblogic-application.xml,该文件需要放置在src/application/META-INF下。
该文件需要指定应从应用程序而不是Weblogic加载的首选包,例如:
<prefer-application-packages>
    <package-name>com.querydsl.*</package-name>
    ...
</prefer-application-packages>

在pom.xml中的EAR模块中,您需要通过在ear插件中提供以下信息来指定应包含此文件:
      <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-ear-plugin</artifactId>
            <version>2.10.1</version>
            <configuration>
                <defaultLibBundleDir>lib</defaultLibBundleDir>
                <earSourceDirectory>src/application</earSourceDirectory>
                <modules>
                    <webModule>
                        <groupId>your-group-id</groupId>
                        <artifactId>your-artifact-id</artifactId>
                        <contextRoot>/**yourContext**</contextRoot>
                    </webModule>
                </modules>
            </configuration>
        </plugin>
    </plugins>

最后一件事,WAR模块需要在/src/main/resources下创建weblogic.xml文件,其中包含两个部分:

<context-root>**yourContext**</context-root>
<container-descriptor>
    <prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>

"yourContext"需要与maven-ear-plugin中提供的相同,并且应该是应用程序的Web上下文。

0

我之前也遇到了一个类似的问题,不过与 NamedParameterJdbcTemplate 有关。

   java.lang.NoSuchMethodException: org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForLong(java.lang.String, org.springframework.jdbc.core.namedparam.SqlParameterSource)

Errors were encountered while performing this operation.

我的项目中有效的方法:在WEB-INF文件夹下的weblogic.xml文件中添加:
<wls:prefer-web-inf-classes>false</wls:prefer-web-inf-classes>
<wls:prefer-application-packages>
   <wls:package-name>org.springframework.jdbc.core.*</wls:package-name>
   <wls:package-name>org.springframework.jdbc.core.namedparam.*</wls:package-name>
</wls:prefer-application-packages>

你可以阅读更多关于这个的内容 → https://docs.oracle.com/cd/E24329_01/web.1211/e21049/weblogic_xml.htm#WBAPP602

--- 附加信息 ---

在EAR模块中,我将weblogic-application.xml放置在src/application/META-INF目录下 但不知何故它没有被考虑进去。 而WAR模块则在src/src/main/webapp/WEB_INF下创建了weblogic.xml。

尝试了第一个答案(在src/src/main/resources中添加一个新的weblogic.xml),出现了IncompatibleClassChangeError


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接