log4j - OSGi 的类加载问题

标签 log4j osgi classloader apache-felix

我使用了 Maven 存储库中的 log4j-1.2.17 包。 我尝试在包中执行此代码(我的包调用 log4j-1.2.17 包)

    PropertyConfigurator.configure(props());
private static Properties props() {
    Properties props = new Properties();
    props.put("log4j.rootLogger", "INFO, R");
    props.put("log4j.appender.R",
            "org.apache.log4j.DailyRollingFileAppender");
    props.put("log4j.appender.R.File", "logs/IhtikaClient.log");
    props.put("log4j.appender.R.Append", "true");
    props.put("log4j.appender.R.Threshold", "INFO");
    props.put("log4j.appender.R.DatePattern", "'.'yyyy-MM-dd");
    props.put("log4j.appender.R.layout", "org.apache.log4j.PatternLayout");
    props.put("log4j.appender.R.layout.ConversionPattern",
            //"%d{HH:mm:ss,SSS} %c - %m%n");
            //"[%5p] %d{yyyy-MM-dd mm:ss} (%F:%M:%L)%n%m%n%n");
            "[%5p] %d{yyyy-MM-dd mm:ss} %c (%F:%M:%L)%n%m%n");
    return props;
}

但是我有错误

log4j:ERROR “org.apache.log4j.DailyRollingFileAppender”对象不可分配给“org.apache.log4j.Appender”变量。 log4j:错误类“org.apache.log4j.Appender”被加载 log4j:ERROR [org.apache.felix.framework.BundleWiringImpl@9da1dd] 而对象类型 log4j:错误“org.apache.log4j.DailyRollingFileAppender”由 [sun.misc.Launcher$AppClassLoader@4b222f] 加载。 log4j:错误无法实例化名为“R”的附加程序。 log4j:ERROR “org.apache.log4j.DailyRollingFileAppender”对象不可分配给“org.apache.log4j.Appender”变量。 log4j:错误类“org.apache.log4j.Appender”被加载 log4j:ERROR [org.apache.felix.framework.BundleWiringImpl@9da1dd] 而对象类型 log4j:错误“org.apache.log4j.DailyRollingFileAppender”由 [sun.misc.Launcher$AppClassLoader@4b222f] 加载。 log4j:ERROR 无法实例化名为“R”的附加程序。

Bundle 已按顺序加载

.getBundleContext().installBundle("......../log4j-1.2.17.jar")
.getBundleContext().installBundle("......../I_MainForm-1.0-SNAPSHOT.jar")

如何解决这个错误? 拜托,对不起我的英语。 最好的问候,亚瑟。

最佳答案

基本上,不要使用 org.osgi.framework.system.packages 将您的类“泄漏”到框架中或 org.osgi.framework.system.packages.extra ,除非你真的需要在你的代码中而不是修复一些其他问题。显然,这是 log4j 问题。

您可以通过设置系统属性来修复它:

-Dlog4j.ignoreTCL=true 

关于log4j - OSGi 的类加载问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11719218/

相关文章:

java - 将 log4j stdout 重定向到 InputStream

java - 修改为日志记录附加的 log4j 的最佳方法

java - 如何在Http Client 4.1中禁用log4j日志记录到FileAppender

osgi - 关闭OSGi容器(特别是春分)的最佳方法

web-applications - 在简单的 Eclipse RAP Web 应用程序中导航

java - 更改 log4j.properties 的位置

eclipse - 配置 Glassfish 以使用 Equinox

java - 使用字节数组中的类而不进行反射?

objective-c - 如何在 Objective-C 中动态加载类?

java - 使用 Java 中的 GroovyClassLoader - 未 GC 的类