类加载问题使用OSGi(Classloading issue with OSGi)

2019-09-20 10:14发布

我从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".

包加载顺序

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

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

Answer 1:

作为您的Log4j类似乎已经被加载sun.misc类加载器,我认为有些事情是从外部的OSGi提供log4j的类。 有Log4J的条目解释为什么它不能加载的Log4J类,这意味着Log4J的一些版本已经存在

您是否使用菲利克斯的定制版本? 如果是这样,你可以找到类似的配置文件与org.osgi.framework.system.packages=...条目或org.osgi.framework.system.packages.extra=...进入?

如果你只是删除Log4j的包,会发生什么? 它仍然可以找到的Log4j类呢?

此致,弗兰克



Answer 2:

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

你可以通过设置系统属性修正:

-Dlog4j.ignoreTCL=true 


Answer 3:

在自己的代码设置的log4j是不是在OSGi的一个好主意。 你应该看看ops4j PAX记录。 它负责将日志框架设置的,你可以简单地使用log4j的API在你的包。 请参阅: http://team.ops4j.org/wiki/display/paxlogging/Pax+Logging



文章来源: Classloading issue with OSGi