Tomcat 6.0中Spring应用程序的部署问题 [英] Deployment issues with Spring app in Tomcat 6.0

查看:133
本文介绍了Tomcat 6.0中Spring应用程序的部署问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在将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接口;当应用程序现在启动时,我收到以下错误:

 引起: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.loa dClass(WebappClassLoader.java:1667)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
at org.springframework.util.ClassUtils.forName(ClassUtils.java: 257)
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
引起: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.Cla ssLoader.loadClass(ClassLoader.java:248)
... 89更多

如果jar从shared / lib移动到应用程序的WEB-INF / lib目录,显然一切正常,但我想尽可能将jar保存在shared / lib中。



这看起来像一个类加载器问题,但是当Spring试图在shared / lib jar中创建bean时,WEB-INF / lib中的spring-context.jar是否已经加载了? / p>

我很困惑;任何帮助将不胜感激。

解决方案

最终实现了shared / lib文件夹正是错误放置这些扩展jar的地方,因为Tomcat中类加载器的分层特性。



相反,我编写了自己的类加载器,扩展了Tomcat的WebappClassLoader:

 公共类CustomWebappClassLoader扩展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(文件文件: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中需要line:

 < Loader loaderClass =com.test.CustomWebappClassLoaderdelegate =true /> 


I'm having problems deploying a Spring web app to Tomcat 6.0. I want to deploy some jars to the shared/lib (catalina.properties is correctly configured); these jars contain various bean definitions. The main application, deployed to the webapps directory, uses:

<import resource="classpath*:com/**/*.xml"/>

to pick up the bean definitions in the jars deployed to shared/lib.

Some of the beans deployed to shared/lib have been updated and now implement the MessageSourceAware interface; when the app now starts, I get the following error:

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

If the jars are moved from shared/lib to the WEB-INF/lib directory of the app, obviously everything works OK, but I'd like to keep the jars in shared/lib if at all possible.

This looks like a classloader issue, but hasn't the spring-context.jar in WEB-INF/lib already been loaded by the time Spring tries to create the beans in the shared/lib jars?

I'm confused; any help would be much appreciated.

解决方案

Realised in the end that the shared/lib folder is exactly the wrong place to put these extension jars, owing to the hierarchical nature of the classloaders in Tomcat.

Instead, I wrote my own class loader that extends Tomcat's 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);
            }
        }
    }
}

This adds any jars in %CATALINA_HOME%/extensions/lib to the classpath (along with WEB-INF/classes and WEB-INF/lib for the application).

The following line is then needed in context.xml:

<Loader loaderClass="com.test.CustomWebappClassLoader" delegate="true"/>

这篇关于Tomcat 6.0中Spring应用程序的部署问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆