Java 从控制台启动OSGI时Log4j2不工作(在Eclipse中工作)

Java 从控制台启动OSGI时Log4j2不工作(在Eclipse中工作),java,eclipse,log4j,osgi,log4j2,Java,Eclipse,Log4j,Osgi,Log4j2,我使用log4j2编写了一个日志程序,并在eclipse上运行。我没有使用任何xml文件进行配置,而是以编程方式修改默认配置。我正在OSGi环境中使用声明性服务进行开发 当我从控制台运行OSGi并启动记录器包时,没有错误。但当我启动另一个正在使用此记录器捆绑包服务的捆绑包时,会显示一个错误,显示: Caused by: java.lang.ClassNotFoundException: javax.naming.NamingException 我把整个错误日志放在这里,以防它提供详细信息。因

我使用log4j2编写了一个日志程序,并在eclipse上运行。我没有使用任何xml文件进行配置,而是以编程方式修改默认配置。我正在OSGi环境中使用声明性服务进行开发

当我从控制台运行OSGi并启动记录器包时,没有错误。但当我启动另一个正在使用此记录器捆绑包服务的捆绑包时,会显示一个错误,显示:

Caused by: java.lang.ClassNotFoundException: javax.naming.NamingException 
我把整个错误日志放在这里,以防它提供详细信息。因此,捆绑包将无法解析。这个问题的原因可能是什么

!SESSION 2014-08-21 23:05:27.381 -----------------------------------------------
eclipse.buildId=unknown
java.version=1.7.0_51
java.vendor=Oracle Corporation
BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_US
Command-line arguments:  -console -consoleLog

!ENTRY comp4 4 0 2014-08-21 23:07:16.979
!MESSAGE [SCR] Error while trying to bind reference Reference[name = ILogger, interface = de.logger.ILogger, policy = static, cardinality = 1..1, target = null, bind = bindLoggerService, unbind = unbindLoggerService]
    Details:
    Problematic reference = Reference[name = ILogger, interface = de.logger.ILogger, policy = static, cardinality = 1..1, target = null, bind = bindLoggerService, unbind = unbindLoggerService]
    of service component = comp4
    component implementation class = de.comp4.finalTest
    located in bundle with symbolic name = comp4
    bundle location = file:\C:\Users\test2\plugins\comp4_1.0.0.jar
!STACK 0
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.eclipse.equinox.internal.ds.model.ComponentReference.bind(ComponentReference.java:367)
    at org.eclipse.equinox.internal.ds.model.ServiceComponentProp.bindReference(ServiceComponentProp.java:430)
    at org.eclipse.equinox.internal.ds.model.ServiceComponentProp.bind(ServiceComponentProp.java:218)
    at org.eclipse.equinox.internal.ds.model.ServiceComponentProp.build(ServiceComponentProp.java:344)
    at org.eclipse.equinox.internal.ds.InstanceProcess.buildComponent(InstanceProcess.java:588)
    at org.eclipse.equinox.internal.ds.InstanceProcess.buildComponents(InstanceProcess.java:196)
    at org.eclipse.equinox.internal.ds.Resolver.buildNewlySatisfied(Resolver.java:441)
    at org.eclipse.equinox.internal.ds.Resolver.enableComponents(Resolver.java:213)
    at org.eclipse.equinox.internal.ds.SCRManager.performWork(SCRManager.java:800)
    at org.eclipse.equinox.internal.ds.SCRManager$QueuedJob.dispatch(SCRManager.java:767)
    at org.eclipse.equinox.internal.ds.WorkThread.run(WorkThread.java:89)
    at org.eclipse.equinox.internal.util.impl.tpt.threadpool.Executor.run(Executor.java:70)
Caused by: java.lang.NoClassDefFoundError: javax/naming/NamingException
    at org.apache.logging.log4j.core.lookup.Interpolator.<init>(Interpolator.java:75)
    at org.apache.logging.log4j.core.config.AbstractConfiguration.<init>(AbstractConfiguration.java:99)
    at org.apache.logging.log4j.core.config.NullConfiguration.<init>(NullConfiguration.java:29)
    at org.apache.logging.log4j.core.LoggerContext.<clinit>(LoggerContext.java:63)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(ClassLoaderContextSelector.java:218)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:125)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:80)
    at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:72)
    at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:37)
    at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:473)
    at de.logger.tinylogger.TinyLogger.setClassName(TinyLogger.java:1097)
    at de.comp4.finalTest.bindLoggerService(finalTest.java:27)
    ... 16 more
Caused by: java.lang.ClassNotFoundException: javax.naming.NamingException
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:513)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417)
    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 28 more
Root exception:
java.lang.NoClassDefFoundError: javax/naming/NamingException
    at org.apache.logging.log4j.core.lookup.Interpolator.<init>(Interpolator.java:75)
    at org.apache.logging.log4j.core.config.AbstractConfiguration.<init>(AbstractConfiguration.java:99)
    at org.apache.logging.log4j.core.config.NullConfiguration.<init>(NullConfiguration.java:29)
    at org.apache.logging.log4j.core.LoggerContext.<clinit>(LoggerContext.java:63)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(ClassLoaderContextSelector.java:218)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:125)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:80)
    at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:72)
    at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:37)
    at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:473)
    at de.logger.tinylogger.TinyLogger.setClassName(TinyLogger.java:1097)
    at de.comp4.finalTest.bindLoggerService(finalTest.java:27)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.eclipse.equinox.internal.ds.model.ComponentReference.bind(ComponentReference.java:367)
    at org.eclipse.equinox.internal.ds.model.ServiceComponentProp.bindReference(ServiceComponentProp.java:430)
    at org.eclipse.equinox.internal.ds.model.ServiceComponentProp.bind(ServiceComponentProp.java:218)
    at org.eclipse.equinox.internal.ds.model.ServiceComponentProp.build(ServiceComponentProp.java:344)
    at org.eclipse.equinox.internal.ds.InstanceProcess.buildComponent(InstanceProcess.java:588)
    at org.eclipse.equinox.internal.ds.InstanceProcess.buildComponents(InstanceProcess.java:196)
    at org.eclipse.equinox.internal.ds.Resolver.buildNewlySatisfied(Resolver.java:441)
    at org.eclipse.equinox.internal.ds.Resolver.enableComponents(Resolver.java:213)
    at org.eclipse.equinox.internal.ds.SCRManager.performWork(SCRManager.java:800)
    at org.eclipse.equinox.internal.ds.SCRManager$QueuedJob.dispatch(SCRManager.java:767)
    at org.eclipse.equinox.internal.ds.WorkThread.run(WorkThread.java:89)
    at org.eclipse.equinox.internal.util.impl.tpt.threadpool.Executor.run(Executor.java:70)
Caused by: java.lang.ClassNotFoundException: javax.naming.NamingException
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:513)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417)
    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 28 more

!ENTRY comp4 4 0 2014-08-21 23:07:17.006
!MESSAGE [SCR] Error while trying to bind reference Reference[name = ILogger, interface = de.logger.ILogger, policy = static, cardinality = 1..1, target = null, bind = bindLoggerService, unbind = unbindLoggerService]
    Details:
    Problematic reference = Reference[name = ILogger, interface = de.logger.ILogger, policy = static, cardinality = 1..1, target = null, bind = bindLoggerService, unbind = unbindLoggerService]
    of service component = comp4
    component implementation class = de.comp4.finalTest
    located in bundle with symbolic name = comp4
    bundle location = file:\C:\test2\plugins\comp4_1.0.0.jar
!STACK 0
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.eclipse.equinox.internal.ds.model.ComponentReference.bind(ComponentReference.java:367)
    at org.eclipse.equinox.internal.ds.model.ServiceComponentProp.bindReference(ServiceComponentProp.java:430)
    at org.eclipse.equinox.internal.ds.model.ServiceComponentProp.bind(ServiceComponentProp.java:218)
    at org.eclipse.equinox.internal.ds.model.ServiceComponentProp.build(ServiceComponentProp.java:344)
    at org.eclipse.equinox.internal.ds.InstanceProcess.buildComponent(InstanceProcess.java:588)
    at org.eclipse.equinox.internal.ds.InstanceProcess.buildComponents(InstanceProcess.java:196)
    at org.eclipse.equinox.internal.ds.Resolver.buildNewlySatisfied(Resolver.java:441)
    at org.eclipse.equinox.internal.ds.Resolver.enableComponents(Resolver.java:213)
    at org.eclipse.equinox.internal.ds.SCRManager.performWork(SCRManager.java:800)
    at org.eclipse.equinox.internal.ds.SCRManager$QueuedJob.dispatch(SCRManager.java:767)
    at org.eclipse.equinox.internal.ds.WorkThread.run(WorkThread.java:89)
    at org.eclipse.equinox.internal.util.impl.tpt.threadpool.Executor.run(Executor.java:70)
Caused by: java.lang.NoClassDefFoundError: javax/naming/NamingException
    at org.apache.logging.log4j.core.lookup.Interpolator.<init>(Interpolator.java:75)
    at org.apache.logging.log4j.core.config.AbstractConfiguration.<init>(AbstractConfiguration.java:99)
    at org.apache.logging.log4j.core.config.NullConfiguration.<init>(NullConfiguration.java:29)
    at org.apache.logging.log4j.core.LoggerContext.<clinit>(LoggerContext.java:63)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(ClassLoaderContextSelector.java:218)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:125)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:80)
    at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:72)
    at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:37)
    at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:473)
    at de.logger.tinylogger.TinyLogger.setClassName(TinyLogger.java:1097)
    at de.comp4.finalTest.bindLoggerService(finalTest.java:27)
    ... 16 more
Caused by: java.lang.ClassNotFoundException: javax.naming.NamingException
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:513)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417)
    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 28 more
Root exception:
java.lang.NoClassDefFoundError: javax/naming/NamingException
    at org.apache.logging.log4j.core.lookup.Interpolator.<init>(Interpolator.java:75)
    at org.apache.logging.log4j.core.config.AbstractConfiguration.<init>(AbstractConfiguration.java:99)
    at org.apache.logging.log4j.core.config.NullConfiguration.<init>(NullConfiguration.java:29)
    at org.apache.logging.log4j.core.LoggerContext.<clinit>(LoggerContext.java:63)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(ClassLoaderContextSelector.java:218)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:125)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:80)
    at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:72)
    at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:37)
    at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:473)
    at de.logger.tinylogger.TinyLogger.setClassName(TinyLogger.java:1097)
    at de.comp4.finalTest.bindLoggerService(finalTest.java:27)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.eclipse.equinox.internal.ds.model.ComponentReference.bind(ComponentReference.java:367)
    at org.eclipse.equinox.internal.ds.model.ServiceComponentProp.bindReference(ServiceComponentProp.java:430)
    at org.eclipse.equinox.internal.ds.model.ServiceComponentProp.bind(ServiceComponentProp.java:218)
    at org.eclipse.equinox.internal.ds.model.ServiceComponentProp.build(ServiceComponentProp.java:344)
    at org.eclipse.equinox.internal.ds.InstanceProcess.buildComponent(InstanceProcess.java:588)
    at org.eclipse.equinox.internal.ds.InstanceProcess.buildComponents(InstanceProcess.java:196)
    at org.eclipse.equinox.internal.ds.Resolver.buildNewlySatisfied(Resolver.java:441)
    at org.eclipse.equinox.internal.ds.Resolver.enableComponents(Resolver.java:213)
    at org.eclipse.equinox.internal.ds.SCRManager.performWork(SCRManager.java:800)
    at org.eclipse.equinox.internal.ds.SCRManager$QueuedJob.dispatch(SCRManager.java:767)
    at org.eclipse.equinox.internal.ds.WorkThread.run(WorkThread.java:89)
    at org.eclipse.equinox.internal.util.impl.tpt.threadpool.Executor.run(Executor.java:70)
Caused by: java.lang.ClassNotFoundException: javax.naming.NamingException
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:513)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417)
    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 28 more

!ENTRY org.eclipse.equinox.ds 4 0 2014-08-21 23:07:17.037
!MESSAGE The component was not built because some of its references could not be bound. The component is Component[
    name = comp4
    activate = activate
    deactivate = deactivate
    modified = 
    configuration-policy = optional
    factory = null
    autoenable = true
    immediate = true
    implementation = de.comp4.finalTest
    state = Unsatisfied
    properties = 
    serviceFactory = false
    serviceInterface = null
    references = {
        Reference[name = ILogger, interface = de.logger.ILogger, policy = static, cardinality = 1..1, target = null, bind = bindLoggerService, unbind = unbindLoggerService]
    }
    located in bundle = comp4_1.0.0 [18]
]

!ENTRY org.eclipse.equinox.ds 4 0 2014-08-21 23:07:17.041
!MESSAGE The component was not built because some of its references could not be bound. The component is Component[
    name = comp4
    activate = activate
    deactivate = deactivate
    modified = 
    configuration-policy = optional
    factory = null
    autoenable = true
    immediate = true
    implementation = de.comp4.finalTest
    state = Unsatisfied
    properties = 
    serviceFactory = false
    serviceInterface = null
    references = {
        Reference[name = ILogger, interface = de.logger.ILogger, policy = static, cardinality = 1..1, target = null, bind = bindLoggerService, unbind = unbindLoggerService]
    }
    located in bundle = comp4_1.0.0 [18]
]

这实际上是一个bug。LOG4J2在OSGi环境中有类加载器问题,与中一样,也是类似的问题

我以前使用的是下载版本apache-log4j-2.0-rc2-bin。 但现在有了一个新版本apache-log4j-2.0.2-bin,它在OSGi环境下运行。但是为了正确解析带有LOG4j2的包,我必须导入“org.osgi.framework.willing”


它仍然向我显示错误“无法重新配置JMX java.lang.NoClassDefFoundError:javax/management/ObjectName…”,我仍然需要找到解决方案,但至少它在从控制台启动的OSGi环境中运行。

我刚刚检查了是否可以调用LogManager.getLogger(),它对我有效。您能提供一个示例(您的环境打包成一个zip或log4j初始化的代码片段)来重现这个问题吗?我已经尝试过删除所有初始化,但仍然是一样的。我首先获取包含Log4j2的包实例,然后调用一个执行LogManager.getLogger()的方法。您使用过相同的方法吗?据我所知,它在调用静态方法LogManager.getLogger()时失败。我在从命令行开始的equinox环境中也调用了它。静态方法调用运行良好,并且出现了日志。这就是为什么我问你是否可以打包失败的样本。我找不到将样本打包到stackoverflow的选项。这就是我用代码片段编辑主要问题的原因。你看到我添加的部分代码了吗?@balazsoldos我从这里的链接中注意到,Log4j2中有一个bug,当嵌入到OSGi中的另一个包中时,会出现类加载器问题。也许你有一个可以用的罐子。你能给我你的Log4j2罐子的链接吗?你有多少jar文件?非常感谢。
....Inside logger...
private static Logger m_Logger;
public void setClassName(String className) 
    {
    //Logger m_Logger = LogManager.getLogger(className); 
    Logger m_Logger = LogManager.getLogger(); 
    m_Logger.error("Logger program working");
    }
....Inside consuming bundle...
protected void OSGiLoggerBind (OSGiLogger myLogger)
    {
    m_LoggerService = myLogger;
m_LoggerService.setClassName(OSGiLoggerTest.class.getName());
    }