我在将Tom Web应用程序部署到Tomcat 6.0时遇到问题。我想将一些jar部署到shared / lib(catalina.properties已正确配置);这些罐包含各种bean定义。部署到webapps目录的主应用程序使用:
<import resource="classpath*:com/**/*.xml"/>
获取部署到shared / lib的jar中的bean定义。
部署到shared / lib的一些bean已经更新,现在实现了MessageSourceAware接口;当应用程序现在启动时,我收到以下错误:
Caused by: java.lang.NoClassDefFoundError: org/springframework/context/MessageSourceAware
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1667)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
at org.springframework.util.ClassUtils.forName(ClassUtils.java:257)
at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:408)
at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1282)
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1253)
... 72 more
Caused by: java.lang.ClassNotFoundException: org.springframework.context.MessageSourceAware
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
... 89 more
如果将jar从shared / lib移动到应用程序的WEB-INF / lib目录,显然一切正常,但我想尽可能将jar保存在shared / lib中。
这看起来像是一个类加载器问题,但是当Spring试图在shared / lib jar中创建bean时,WEB-INF / lib中的spring-context.jar是否已经加载了?
我很困惑;任何帮助将不胜感激。答案 0 :(得分:1)
将包含org.springframework.context.MessageSourceAware的jar文件添加到Classpath。如果您正在使用Eclipse(我假设您是)右键单击项目并单击Build Path。并将相应的jar文件添加到classpath。
答案 1 :(得分:1)
最终意识到,由于Tomcat中类加载器的分层特性,共享/ lib文件夹正好是放置这些扩展jar的错误的位置。
相反,我编写了自己的类加载器,扩展了Tomcat的WebappClassLoader:
public class CustomWebappClassLoader extends WebappClassLoader {
public CustomWebappClassLoader() {
super();
addCustomRepository();
}
public CustomWebappClassLoader(ClassLoader parent) {
super(parent);
addCustomRepository();
}
private void addCustomRepository() {
String catalinaHome = System.getProperty("catalina.home");
File dir = new File(catalinaHome, String.format("extensions%slib", File.separator));
for (File file : dir.listFiles()) {
if (file.getName().endsWith(".jar")) {
String repository = String.format("file:/%s", file.getAbsolutePath());
addRepository(repository);
}
}
}
}
这会将%CATALINA_HOME%/ extensions / lib中的任何jar添加到类路径中(以及应用程序的WEB-INF / classes和WEB-INF / lib)。
context.xml中需要以下行:
<Loader loaderClass="com.test.CustomWebappClassLoader" delegate="true"/>
答案 2 :(得分:0)
您需要在项目spring-context-x.y.z.jar
文件夹或WEB-INF/lib
文件夹中包含TOMCAT_HOME/lib
x
,y
,{{1}是版本号)。