Не удается получить доступ к пользовательским банкам из папки lib Tomcat
У меня есть две пользовательские банки (websso jars), которые требуются для нескольких проектов. Поэтому я помещаю эти банки в папку lib Tomcat. Но эти пользовательские банки используют банки безопасности Springframework (AbstractPreAuthenticatedProcessingFilter.class). Когда я развертываю приложение, оно дает мне следующие исключения.
Как я могу получить доступ к пользовательским jar-файлам, развернутым в папке lib tomcat из приложения?
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
Как я могу получить доступ к пользовательским jar-файлам, развернутым в папке lib tomcat из приложения?
1 ответ
Вы должны поместить Spring JAR в server/lib/
папка тоже. В частности: все зависимости JAR за пределами WEB-INF/lib/
должен быть в server/lib/
папка. Зачем?
Ваше веб-приложение загружено с помощью WebAppClassLoader, в котором есть несколько хитростей для загрузки JAR-файлов из WEB-INF/lib/
возможный. Для любого класса, который он не может найти, он запросит родительский загрузчик классов. Родитель, который был создан задолго до WebAppClassLoader, не имеет представления о веб-приложениях и WEB-INF/lib/
,
Простая причина заключается в следующем: если у вас развернуто два приложения, которые содержат Spring JAR, какое из них предпочтительнее для загрузчика родительского класса?
Значит, ваше веб-приложение загружает код безопасности. Эти классы могут видеть только то, что в server/lib/
и ничего больше.
Вот почему я избегаю server/lib/
- это не очень помогает, и это может создать много проблем (например, ClassCastException: foo.Bar != foo.Bar
). Поскольку большая часть кода Java не дает правильных глобальных значений, я нацеливаюсь на одно приложение на сервер. Да, я знаю о протесте после такого явно глупого и непрофессионального заявления. Просто этот подход всегда работает, снижает затраты на обслуживание, а когда он не работает, у вас есть только несколько конкретных мест для поиска - вместо нескольких сотен мегабайт чужого кода.