【问题标题】:Classloading issue with OSGiOSGi 的类加载问题
【发布时间】:2012-07-27 23:40:20
【问题描述】:

我使用了来自 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 A "org.apache.log4j.DailyRollingFileAppender" object is not assignable to a "org.apache.log4j.Appender" variable. log4j:ERROR The class "org.apache.log4j.Appender" was loaded by log4j:ERROR [org.apache.felix.framework.BundleWiringImpl@9da1dd] whereas object of type log4j:ERROR "org.apache.log4j.DailyRollingFileAppender" was loaded by [sun.misc.Launcher$AppClassLoader@4b222f]. log4j:ERROR Could not instantiate appender named "R". log4j:ERROR A "org.apache.log4j.DailyRollingFileAppender" object is not assignable to a "org.apache.log4j.Appender" variable. log4j:ERROR The class "org.apache.log4j.Appender" was loaded by log4j:ERROR [org.apache.felix.framework.BundleWiringImpl@9da1dd] whereas object of type log4j:ERROR "org.apache.log4j.DailyRollingFileAppender" was loaded by [sun.misc.Launcher$AppClassLoader@4b222f]. log4j:ERROR Could not instantiate appender named "R".

Bundles 已按顺序加载

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

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

【问题讨论】:

    标签: log4j osgi classloader apache-felix


    【解决方案1】:

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

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

    -Dlog4j.ignoreTCL=true 
    

    【讨论】:

      【解决方案2】:

      由于您的 Log4j 类似乎已由 sun.misc 类加载器加载,我认为某些东西正在从 OSGi 外部提供 log4j 类。有 Log4J 条目解释了它为什么无法加载 Log4J 类的事实意味着某些版本的 Log4J已经存在

      您使用的是定制版的 Felix 吗?如果是这样,您能找到类似带有org.osgi.framework.system.packages=... 条目或org.osgi.framework.system.packages.extra=... 条目的配置文件吗?

      如果您只是删除 Log4j 捆绑包会发生什么?那它还能找到 Log4j 类吗?

      问候,弗兰克

      【讨论】:

      • 你好。是的,这是我的错误 - 主应用程序(加载器应用程序)具有 log4j 库(不是捆绑包)。删除此库后,现在未显示执行。对不起我的英语。谢谢。
      • @user913766:请使用左侧的勾号确认此答案是正确的。
      【解决方案3】:

      在您自己的代码中设置 log4j 在 OSGi 中不是一个好主意。你应该看看 ops4j pax logging。它负责日志框架的设置,你可以简单地在你的包中使用 log4j api。见:http://team.ops4j.org/wiki/display/paxlogging/Pax+Logging

      【讨论】:

        猜你喜欢
        • 2011-12-05
        • 2012-07-08
        • 2014-09-04
        • 2011-08-05
        • 1970-01-01
        • 1970-01-01
        • 2016-07-13
        • 2017-11-04
        • 1970-01-01
        相关资源
        最近更新 更多