Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不同Log4j类上的不同ClassNotFoundException_Java_Classnotfoundexception - Fatal编程技术网

Java 不同Log4j类上的不同ClassNotFoundException

Java 不同Log4j类上的不同ClassNotFoundException,java,classnotfoundexception,Java,Classnotfoundexception,我们在一个基于Swing/Spring的大型应用程序中看到以下异常。该错误发生在用户交互过程中,触发Spring通过commons loggingwarn(String,Throwable)报告警告,后者反过来调用log4j。不幸的是,我无法将这个问题分解为一个独立的示例 Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org/apache/log4j/spi/ThrowableInformation

我们在一个基于Swing/Spring的大型应用程序中看到以下异常。该错误发生在用户交互过程中,触发Spring通过commons logging
warn(String,Throwable)
报告警告,后者反过来调用log4j。不幸的是,我无法将这个问题分解为一个独立的示例

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org/apache/log4j/spi/ThrowableInformation
    at org.apache.log4j.spi.LoggingEvent.<init>(LoggingEvent.java:165)
    at org.apache.log4j.Category.forcedLog(Category.java:391)
    at org.apache.log4j.Category.log(Category.java:856)
    at org.apache.commons.logging.impl.Log4JLogger.warn(Log4JLogger.java:234)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:487)
    <company specific code>
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:749)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:702)
    at java.awt.EventQueue$3.run(EventQueue.java:696)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:719)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.spi.ThrowableInformation
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 27 more
  • 成功引用了以后无法从应用程序入口点加载的类,例如ThowableInformation
代码

380如果(结果==null){
381抛出新的ClassNotFoundException(名称);//根本原因
URLClassLoader已经关闭,这带来了Java报告ClassNotFoundException的不幸后果

背景 为了支持使用OSGI/Spring DM的应用程序的早期版本,我们在Spring XML中有bean,它允许从正确的捆绑包中加载资源,这是一个可怕的黑客行为,但在给定代码、资源和XML文件位于不同捆绑包中时,唯一可以做到这一点的方法

<bean id="classLoader" class="org.example.internal.PluginModuleClassLoader" factory-method="getClassLoader" />
<bean id="imageLoader" class="org.example.ImageLoader">
   <property name="classLoader" ref="classLoader" />
</bean>

public class PluginModuleClassLoader {
   public static ClassLoader getClassLoader() {
      return PluginModuleClassLoader.class.getClassLoader();
   }
}

公共类PluginModuleClassLoader{
公共静态类加载器getClassLoader(){
返回PluginModuleClassLoader.class.getClassLoader();
}
}
我们在6个月前将Spring从(2.5.5)升级到4.1.2)并删除了OSGI,因为它没有任何好处,但是现在遗留的PluginModuleClassLoader机制由于从60多个捆绑包中删除它的成本而保留了下来

它是怎么关上的 所讨论的用户交互关闭一个应用程序上下文并加载另一个应用程序上下文…这会产生破坏应用程序上下文的副作用。Spring会自动销毁所有bean。对于类加载器bean,它会自动调用close()方法,即URLClassLoader.close()这意味着所有后续查找都会失败,并导致ClassNotFoundException

根本原因 URLClassLoader已经关闭,这带来了Java报告ClassNotFoundException的不幸后果

背景 为了支持使用OSGI/Spring DM的应用程序的早期版本,我们在Spring XML中有bean,它允许从正确的捆绑包中加载资源,这是一个可怕的黑客行为,但在给定代码、资源和XML文件位于不同捆绑包中时,唯一可以做到这一点的方法

<bean id="classLoader" class="org.example.internal.PluginModuleClassLoader" factory-method="getClassLoader" />
<bean id="imageLoader" class="org.example.ImageLoader">
   <property name="classLoader" ref="classLoader" />
</bean>

public class PluginModuleClassLoader {
   public static ClassLoader getClassLoader() {
      return PluginModuleClassLoader.class.getClassLoader();
   }
}

公共类PluginModuleClassLoader{
公共静态类加载器getClassLoader(){
返回PluginModuleClassLoader.class.getClassLoader();
}
}
我们在6个月前将Spring从(2.5.5)升级到4.1.2)并删除了OSGI,因为它没有任何好处,但是现在遗留的PluginModuleClassLoader机制由于从60多个捆绑包中删除它的成本而保留了下来

它是怎么关上的
所讨论的用户交互关闭一个应用程序上下文并加载另一个应用程序上下文…这会产生破坏应用程序上下文的副作用。Spring会自动销毁所有bean。对于类加载器bean,它会自动调用close()方法,即URLClassLoader.close()这意味着所有后续的查找都会失败,ClassNotFoundException

您的类路径上还有其他版本的log4j吗?对不起……我想我没有读到“在depthly中”.使用-verbose查看您的类路径中是否真的有log4j。它看起来确实不像。这是一个servlet还是其他多类路径环境?也许您的类路径上有其他版本的log4j?抱歉…我想我没有读到“深度”中的内容。使用-verbose查看类路径中是否真的有log4j。它看起来确实不像。这是一个servlet还是其他多类路径环境?可能
[Loaded org.apache.log4j.Category from file:/<path redacted>/log5j-1.2.17.jar]
[Loaded org.apache.log4j.Logger from file:/<path redacted>/log5j-1.2.17.jar]
[Loaded org.apache.log4j.Priority from file:/<path redacted>/log5j-1.2.17.jar]
<bean id="classLoader" class="org.example.internal.PluginModuleClassLoader" factory-method="getClassLoader" />
<bean id="imageLoader" class="org.example.ImageLoader">
   <property name="classLoader" ref="classLoader" />
</bean>

public class PluginModuleClassLoader {
   public static ClassLoader getClassLoader() {
      return PluginModuleClassLoader.class.getClassLoader();
   }
}