无法从tomcat的lib文件夹访问自定义jar

时间:2015-09-28 09:41:15

标签: spring spring-mvc tomcat spring-security classpath

我有两个自定义罐子(websso罐子),这是多个项目所需要的。因此,我将这些jar放在Tomcat的lib文件夹中。但是,这些自定义jar使用springframework安全(AbstractPreAuthenticatedProcessingFilter.class)jar。当我部署应用程序时,它给出了以下例外情况。

如何从应用程序访问tomcat的lib文件夹中部署的自定义jar?

 Related cause:
 org.springframework.beans.factory.CannotLoadBeanClassException: Error
 loading class
 [com.db.websso.providers.authentication.springsecurity.WebSSOPreAuthenticationFilter]
 for bean with name 'preAuthenticationProcessingFilter' defined in
 ServletContext resource [/WEB-INF/root-context.xml]: problem with
 class file or dependent class; nested exception is
 java.lang.NoClassDefFoundError:
 org/springframework/security/web/authentication/preauth/AbstractPreAuthenticatedProcessingFilter
    at
 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:336)
    at
 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
    at
 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedList(BeanDefinitionValueResolver.java:359)
    at
 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:157)
    at
 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1471)
    at
 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1216)
    at
 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
    at
 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    at
 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    at
 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229)
    at
 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    at
 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at
 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:706)
    at
 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
    at
 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
    at
 org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
    at
 org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
    at
 org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
    at
 org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4973)
    at
 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5467)
    at
 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at
 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at
 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)     at
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
 Caused by: java.lang.NoClassDefFoundError:
 org/springframework/security/web/authentication/preauth/AbstractPreAuthenticatedProcessingFilter

 Caused by: java.lang.ClassNotFoundException: org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter

如何从应用程序访问tomcat的lib文件夹中部署的自定义jar?

1 个答案:

答案 0 :(得分:0)

您还需要将Spring JAR放入server/lib/文件夹中。具体来说:WEB-INF/lib/之外的JAR的所有依赖项必须位于server/lib/文件夹中。为什么呢?

您的网络应用程序加载了WebAppClassLoader,其中包含一些技巧,可以从WEB-INF/lib/加载JAR。对于它无法找到的任何类,它将询问父类加载器。在WebAppClassLoader之前创建的父项不知道Web应用程序和WEB-INF/lib/

一个简单的原因是:如果您部署了两个包含Spring JAR的应用程序,那么父类加载器应该选择哪一个?

这意味着您的网络应用加载了安全代码。这些课程只能查看server/lib/中的内容和其他内容

这就是我避免server/lib/的原因 - 它没有多大帮助,它可以产生很多问题(比如ClassCastException: foo.Bar != foo.Bar)。因为很多Java代码都没有得到它的全局性,所以我的目标是每个服务器只有一个应用程序。是的,我知道在这种明显愚蠢和不专业的声明之后的强烈抗议。只是这种方法总是有效,降低了维护成本,当它不起作用时,你只有几个特定的​​地方可以看 - 而不是几百兆的外来代码。