slf4j Logger,LoggerFactory在运行时不能从子jar中运行

时间:2017-06-16 07:42:18

标签: runtime slf4j

在子jar中使用slf4j Logger和LoggerFactory时,我遇到了一个问题(假设是CHILD.jar)。 我正在 WebSphere 中部署一个EAR。 EAR结构如下 -

亲耳>

  • META-INF
  • 项目特定依赖关系罐
  • 捆绑为罐子的项目子模块
  • 共享记录-1.0.4.jar
  • 共测井API-1.1.jar
  • CHILD.jar

在CHILD.jar的MANIFEST.MF中,我们没有提供任何CLASSPTH条目,因为这个CHILD.jar被其他几个应用程序使用,而那些其他应用程序可能不使用任何相同的slf4j实现者。 下面是MANIFEST文件结构 -

  

清单 - 版本:1.0

     

Build-Jdk:1.7.0

     

内置:C12560

     

Archiver-Version:Plexus Archiver

     

创建者:Apache Maven 3.0.4

在我们的应用程序中,我们将所有jar保持在 CHILD.jar 所在的同一层次结构中。 现在在部署时,不会抛出任何异常。在运行时,它在我们使用 org.slf4j.Logger org的所有类中抛出 InvocationTargetException (以及 NoClassDefFoundError ) .slf4j.LoggerFactory 即可。 如果我们注释掉所有这些记录器条目,那么应用程序工作正常,并且在运行时不会抛出任何异常。

即使我们使用org.apache.log4j.Logger 而不是 org.slf4j.Logger,代码也在运行时工作(注意 - log4j-1.2.13.jar同样存在层次结构为CHILD.jar)。

查询 - slf4j没有得到它的实现者吗? 我必须包含在与CHILD.jar相同的层次中的任何罐子吗?

请注意 - 我尝试在与CHILD.jar相同的层次结构中包含jcl-over-slf4j jar和log4j-over-slf4j.jar(并删除了common-logging.jar)但是它没有工作。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

如果你想使用jcl或log4j作为slf4j的实现者,你需要的是slf4j-jcl.jar或slf4j-log4j.jar。

此外,在获取NoClassDefFoundError时,您应该完成完整的堆栈跟踪。通常它是由其他一些例外造成的。