Classloader выдает загрузку библиотеки в Tomcat 6 - PullRequest
4 голосов
/ 23 января 2011

Я пытаюсь написать нового слушателя для Jira, и я столкнулся с проблемой, с которой я был бы очень признателен за помощь и руководство.

Справочная информация Мы работаем с Jira 4.2.2 Enterprise WAR под Apache Tomcat.Это включает в себя следующие файлы jar в webapps / jira / WEB-INF / lib:

* slf4j-api-1.5.8.jar
* slf4j-log4j12-1.5.8.jar

У нас есть простой класс, который запускается как плагин.Он получает события и в зависимости от типа события выполняет некоторую работу.Этот класс использует slf4j для ведения журнала и работает как положено.Класс упакован в jar и развернут в webapps / jira / WEB-INF / lib и используется оттуда.Мы можем добавить это в качестве прослушивателя, настроить его и видеть сообщения инициализации в журнале.Все ведение журнала происходит через slf4j и работает.

Когда мы пытаемся добавить функциональность в наш плагин из сторонней библиотеки, мы получаем следующее исключение: com.atlassian.util.concurrent.LazyReference $ InitializationException: java.lang.NoClassDefFoundError: org / slf4j / LoggerFactory

Поскольку slf4j доступен и используется классом, из которого мы вызываем эту стороннюю библиотеку, я не понимаю, что я делаю неправильно или как сделать это доступным в то времячто вызов сделан.

Рабочий случай

В нашем коде мы создаем регистратор следующим образом:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.3rdparty.login;
public class JiraSampleListener extends AbstractIssueEventListener implements IssueEventListener {
    private final static Logger logger = LoggerFactory.getLogger(JiraSampleListener.class);
    .
    .
    .

Затем мы можем использоватьэто путем вызова

logger.warn("MESSAGE")

Ожидаемое сообщение появляется в наших журналах.

Ошибка

Как только мы добавим к этому следующий кодкласс, мы получаем прикрепленное исключение:

newThing = new 3rdPartyClass("name of thing");

Исключение

com.atlassian.util.concurrent.LazyReference $ InitializationException: java.lang.NoClassDefFoundError: org/ slf4j / LoggerFactory

Буду очень признателен за любые советы по разрешению этого или указаний на то, что я делаю неправильно!

Ниже следует более полное представление об исключении ...

2011-01-19 05:30:51,016 main ERROR      [com.atlassian.jira.ComponentManager] Error occurred 
while starting component 'com.atlassian.jira.event.DefaultListenerManager'.
com.atlassian.util.concurrent.LazyReference$InitializationException: java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
        at com.atlassian.util.concurrent.LazyReference.getInterruptibly(LazyReference.java:148)
        at com.atlassian.util.concurrent.LazyReference.get(LazyReference.java:111)
        at com.atlassian.util.concurrent.ResettableLazyReference.get(ResettableLazyReference.java:89)
        at com.atlassian.jira.event.DefaultListenerManager$Listeners.start(DefaultListenerManager.java:93)
        at com.atlassian.jira.event.DefaultListenerManager.start(DefaultListenerManager.java:38)
        at com.atlassian.jira.ComponentManager.quickStart(ComponentManager.java:256)
        at com.atlassian.jira.ComponentManager.start(ComponentManager.java:212)
        at com.atlassian.jira.upgrade.ConsistencyLauncher.launchConsistencyChecker(ConsistencyLauncher.java:63)
        at com.atlassian.jira.upgrade.ConsistencyLauncher.contextInitialized(ConsistencyLauncher.java:42)
        at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3972)
        at org.apache.catalina.core.StandardContext.start(StandardContext.java:4467)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546)
        at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:637)
        at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:563)
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:498)
        at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1277)
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:321)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
        at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
        at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
        at org.apache.catalina.core.StandardService.start(StandardService.java:519)
        at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
        at 3rd.party.3rdPartyClassDefaultImpl.(3rdPartyClassDefaultImpl.java:101)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:169)
        at 3rd.party.3rdParty.(3rdParty.java:107)
        at 3rd.party.3rdParty.(3rdParty.java:83)
        at 3rd.party.3rdParty.(3rdParty.java:67)
        at my.organisationlisteners.JiraSampleListener.init(JiraSampleListener.java:36)
        at com.atlassian.jira.event.ListenerFactory.getListener(ListenerFactory.java:33)
        at com.atlassian.jira.event.DefaultListenerManager$Listeners.loadListeners(DefaultListenerManager.java:126)
        at com.atlassian.jira.event.DefaultListenerManager$Listeners.create(DefaultListenerManager.java:71)
        at com.atlassian.jira.event.DefaultListenerManager$Listeners.create(DefaultListenerManager.java:66)
        at com.atlassian.util.concurrent.ResettableLazyReference$InternalReference.create(ResettableLazyReference.java:143)
        at com.atlassian.util.concurrent.LazyReference$Sync.run(LazyReference.java:316)
        at com.atlassian.util.concurrent.LazyReference.getInterruptibly(LazyReference.java:142)
        ... 32 more
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
        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 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
        ... 46 more

1 Ответ

1 голос
/ 23 января 2011
Caused by: java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory at              
3rd.party.3rdPartyClassDefaultImpl.(3rdPartyClassDefaultImpl.java:101) at         
java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:169) at 
3rd.party.3rdParty.(3rdParty.java:107) at 3rd.party.3rdParty.(3rdParty.java:83) at 
3rd.party.3rdParty.(3rdParty.java:67) at 

Это означает, что ваш класс 3rdPartyClassDefaultImpl не может найти LoggerFactory. Эта сторонняя библиотека находится в каталоге CATALINA_HOME \ lib? если это так, это означает, что он загружается "Общим загрузчиком классов" ( загрузчики классов в tomcat ), и все необходимые классы (3rdPartyClassDefaultImpl, LoggerFactory) ищутся в репозиториях классов или родительских классов и не могут быть найдены.

одним из возможных решений было бы разместить файл thirparty.jar в web-inf/lib или переместить slf4j и log4jwrapper в CATALINA_HOME\LIB

...