2011-01-23 58 views
4

我想爲Jira寫一個新的監聽器,我遇到了一個問題,我真的很感謝一些幫助和指導。Classloader問題在Tomcat中加載庫6

背景 我們在Apache Tomcat下運行Jira 4.2.2 Enterprise WAR。這包括在的webapps/JIRA/WEB-INF/lib目錄下的jar文件:

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

我們有運行作爲一個插件一個簡單的類。它接收事件並根據事件的類型做一些工作。該類使用slf4j進行日誌記錄,並按預期工作。該類打包成一個jar包並部署在webapps/jira/WEB-INF/lib下並從那裏使用。我們可以將其添加爲偵聽器,配置它並在日誌中查看init消息。所有的日誌記錄都是通過slf4j進行的並且可行

當我們試圖從第三方庫,以我們的插件添加的功能,我們收到以下異常: com.atlassian.util.concurrent.LazyReference $ InitializationException:java.lang.NoClassDefFoundError:組織/ 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

任何意見上解決這個或指針,我在這裏做錯了將不勝感激d!

異常的更全面的觀點如下...

 
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
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下嗎?如果是這樣,這意味着它被「通用類加載器」(classloaders in tomcat)加載,並且所有必需的類(3rdPartyClassDefaultImpl, LoggerFactory)都會在其父類或父類的存儲庫中進行搜索,並且無法找到。

其中一個可能的解決方案是放置thirparty。罐子下web-inf/lib或移動SLF4J和log4jwrapper到CATALINA_HOME\LIB

+0

的第三方庫是在classpath,在$ {定義} CATALINA_HOME /bin/setenv.sh 如果我添加SLF4J到classpath中,那麼其他應用程序沒有的東西更長的工作。 – Anonymouslemming 2011-01-23 17:39:49