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