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

标签 spring maven tomcat jar spring-security

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

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

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

  1. 添加<scope>provided</scope> tag依赖于 pom.xml
  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 jars 一起工作?

最佳答案

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

人们常犯的另一个错误(并不明显)是,从 JVM 的角度来看,类的身份既是类名又是加载它的类加载器的身份。因此,如果两个类加载器加载同一个类,则不能将其中一个的实例转换为另一个。

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

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

关于spring - 无法使用 CATALINA_HOME/lib 文件夹中的 Spring 和 Spring Security jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15135440/

相关文章:

找不到 Spring Security 标记库

spring - Spring feign 客户端中 @QueryParam 名称中的特殊字符

java - maven项目中的Classloader.getResources()返回一个空的Enumeration

java - 在 Safari 中, session 不会在后续的 POST 和 GET 之间保持

spring - 严重 : Servlet threw load() exception javax. servlet.UnavailableException

java - Spring 能否理解 @Inject 将 Weld 替换为 JSR-299 实现?

java - Spring Boot部署WAR

maven - 如何在不同的阶段从Maven构建2个docker镜像?

java - 为什么我在 springboot 中收到错误 Factory method 'halLinkDisocoverer' throwed exception?

java - tomcat 7 将本地主机更改为 ip 地址/主机名