无法使用CATALINA_HOME / lib文件夹中的Spring和Spring Security jar

时间:2013-02-28 12:20:58

标签: spring maven tomcat jar spring-security

我正在开发一个部署在tomcat 7上的java Web应用程序。 我在这个应用程序中使用Maven, Spring, spring security 3.0.5.RELEASE and JSF

我想在CATALINA_HOME/lib中放置spring和jsf jar文件,因为我也在其他应用程序中使用它们。现在,我的战争文件中有大部分这些罐子。

我正在做的将jar从war文件中分离出来的步骤如下:

  1. <scope>provided</scope> tag
  2. 中添加pom.xml依赖项
  3. 将jar文件放在CATALINA_HOME/lib
  4. 当我为JSF jar执行这些步骤时,一切正常。
    但是当我为春季和春季做同样的安全罐时,应用程序没有启动并引发错误。

    例如:如果我将<scope>provided</scope>标记添加到以下依赖项中,我的应用会停止工作并抛出Caused by: java.lang.ClassNotFoundException: org.springframework.core.io.Resource异常:

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

    请参阅here中的完整堆栈跟踪here

    中的 pom.xml

    如何让我的webapp在CATALINA_HOME / lib中使用spring jars?

2 个答案:

答案 0 :(得分:1)

你遇到了一个类加载器问题。

您的某些类需要使用其他类加载器加载其他类。

有关详细信息,请参阅http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html

尝试让Spring脱离战争(分享它,或者尽量减少战争的规模)似乎是一个好主意,但这会导致麻烦。

即使你设法使其工作,你最终也会陷入日志API ......

答案 1 :(得分:1)

将应用程序jar放在tomcat lib目录中通常是一个坏主意。将它们全部留在你的战争中,以便它们仅限于该应用程序。如果搜索,您会发现此异常重复多次。

人们犯的另一个常见错误(并且不明显)是从JVM的角度来看类的标识是类名和加载它的类加载器的标识。因此,如果两个类加载器加载相同的类,则无法将一个实例转换为另一个类。

类加载器经常令人困惑,你最好坚持使用人们使用的标准方法。将所有应用程序jar放在WEB-INF/lib中,以便它们与其他应用程序隔离,并确保在常见的lib目录中没有任何重复的jar。另外,请检查您的应用程序,确保每个jar只有一个版本。

在Web应用程序中,您通常需要标记为provided的唯一内容是servlet-api jar。