Не удается получить доступ к пользовательским банкам из папки 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 не дает правильных глобальных значений, я нацеливаюсь на одно приложение на сервер. Да, я знаю о протесте после такого явно глупого и непрофессионального заявления. Просто этот подход всегда работает, снижает затраты на обслуживание, а когда он не работает, у вас есть только несколько конкретных мест для поиска - вместо нескольких сотен мегабайт чужого кода.

Другие вопросы по тегам