Tomcat 6.0中Spring应用程序的部署问题

我在将Tom Web应用程序部署到Tomcat 6.0时遇到问题。 我想将一些jar部署到shared / lib(catalina.properties已正确配置); 这些jar包含各种bean定义。 部署到webapps目录的主应用程序使用:

 

在部署到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是否已经加载了?

我糊涂了; 任何帮助将非常感激。

将包含org.springframework.context.MessageSourceAware的jar文件添加到Classpath。 如果您正在使用Eclipse(我假设您是)右键单击项目并单击Build Path。 并将相应的jar文件添加到classpath。

由于Tomcat中类加载器的分层特性,最终实现了shared / 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中需要以下行:

  

您需要在项目WEB-INF/lib文件夹或TOMCAT_HOME/lib文件夹中包含spring-context-xyzjar (其中xyz是版本号)。