【问题标题】:Unable to use Spring and Spring Security jars from CATALINA_HOME/lib folder无法使用 CATALINA_HOME/lib 文件夹中的 Spring 和 Spring Security jar
【发布时间】:2013-02-14 15:19:12
【问题描述】:

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

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

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

  1. pom.xml 中添加<scope>provided</scope> tag 依赖项
  2. 将jar文件放入CATALINA_HOME/lib

当我为 JSF jar 执行这些步骤时,一切正常。
但是当我对 spring 和 spring security jars 执行相同操作时,应用程序没有启动并抛出错误。

例如:如果我将 <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 jar 位置一起工作?

【问题讨论】:

    标签: spring maven tomcat jar spring-security


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      您遇到了类加载器问题。

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

      更多信息请参见http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html

      尝试将 Spring 排除在您的战争之外(分享它,或最小化战争的规模)似乎是个好主意,但它会导致麻烦。

      即使你设法让它工作,你最终也会把日志 API 弄得一团糟......

      【讨论】:

        猜你喜欢
        • 2018-09-07
        • 2016-01-06
        • 2015-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多