我正在开发一个部署在tomcat 7
上的java Web应用程序。
我在这个应用程序中使用Maven, Spring, spring security 3.0.5.RELEASE and JSF
。
我想在CATALINA_HOME/lib
中放置spring和jsf jar文件,因为我也在其他应用程序中使用它们。现在,我的战争文件中有大部分这些罐子。
我正在做的将jar从war文件中分离出来的步骤如下:
<scope>provided</scope> tag
pom.xml
依赖项
CATALINA_HOME/lib
当我为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>
中的 pom.xml
如何让我的webapp在CATALINA_HOME / lib中使用spring jars?
答案 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。