OSGi的类加载问题

u5i3ibmn  于 2022-11-06  发布在  其他
关注(0)|答案(4)|浏览(130)

我已经使用了来自Maven repo的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")

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

9jyewag0

9jyewag01#

基本上,不要使用org.osgi.framework.system.packagesorg.osgi.framework.system.packages.extra将你的类“泄漏”到框架中,除非你真的需要在你的代码中,而不是修复其他一些问题。显然,这是log4j问题。
您可以通过设置系统属性来修复它:

-Dlog4j.ignoreTCL=true
72qzrwbm

72qzrwbm2#

因为你的Log4j类似乎是由sun.misc类加载器加载的,我认为有什么东西从OSGi外部提供了log4j类。事实上,有Log4J条目解释了为什么它不能加载Log4J类,这意味着Log4J的某个版本 * 已经存在 *。
您使用的是自定义版本的Felix吗?如果是,您能找到类似于org.osgi.framework.system.packages=...条目或org.osgi.framework.system.packages.extra=...条目的配置文件吗?
如果你只是简单地删除Log4j包会发生什么?它还能找到Log4j类吗?
此致,弗兰克

wnrlj8wa

wnrlj8wa3#

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

ifmq2ha2

ifmq2ha24#

这对我很有效:

mvn install -D log4j.ignoreTCL=true

相关问题