我有两个自定义罐子(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?
答案 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代码都没有得到它的全局性,所以我的目标是每个服务器只有一个应用程序。是的,我知道在这种明显愚蠢和不专业的声明之后的强烈抗议。只是这种方法总是有效,降低了维护成本,当它不起作用时,你只有几个特定的地方可以看 - 而不是几百兆的外来代码。