我正在开发一个部署在 tomcat 7
上的 Java Web 应用程序.
我正在使用 Maven, Spring, spring security 3.0.5.RELEASE and JSF
在这个应用程序中。
我想将 spring 和 jsf jar 文件放在 CATALINA_HOME/lib
中,因为我也在其他应用程序中使用它们。现在我的 war 文件中有大部分这些 jar。
我从 war 文件中分离 jar 的步骤如下:
- 添加
<scope>provided</scope> tag
依赖于pom.xml
- 将 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/