找不到当前目录中的log4j.xml

时间:2013-06-19 23:14:06

标签: java log4j

我有一个可运行的jar文件。

我有一个log4j.xml文件,位于同一目录中。

我的课程路径包含“。”

env |grep CLASS
CLASSPATH=.;C:\Program Files (x86)\Java\jre6\lib\ext\QTJava.zip

但是当我运行java -jar myrunnable.jar时,我收到以下消息。

log4j:WARN No appenders could be found for logger (org.apache.commons.configuration.PropertiesConfiguration).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

奇怪的是,如果我将该jar包装在launch4j可执行文件中,它会看到log4j.xml文件并使用它。

我确实转到了错误消息中提到的F​​AQ页面。内容如下:

  

当找不到默认配置文件log4j.properties和log4j.xml且应用程序不执行显式配置时,会发生这种情况。 log4j使用Thread.getContextClassLoader()。getResource()来定位默认配置文件,而不是直接检查文件系统。了解放置log4j.properties或log4j.xml的适当位置需要了解正在使用的类加载器的搜索策略。

为了让我的runnable jar看到log4j.xml没有将-Dlog4j.configuration=file:\\\\my\crazy\long\path\to\my\eclipse\workspace\target\directory\log4j.xml添加到命令行,这是一个要输出的PITA,我有点理解我需要做什么

如果我尝试java -Dlog4j.debug -Dlog4j.configuration=.\\log4j.xml -jar myrunnable.jar

之类的话
log4j: Trying to find [.\\log4j.xml] using context classloader sun.misc.Launcher $AppClassLoader@265f00f9.
log4j: Trying to find [.\\log4j.xml] using sun.misc.Launcher$AppClassLoader@265f00f9 class loader.
log4j: Trying to find [.\\log4j.xml] using ClassLoader.getSystemResource().
log4j: Could not find resource: [.\\log4j.xml].

不同组合log4j.xml./log4j.xml

的结果相同

如果它有所不同,这是通过标准的slf4j-log4j绑定使用log4j的windows 7 / java 7/64位。

附加说明:

  • 尝试java -cp .失败
  • 还尝试java -cp .\\
  • 检查了jar文件META-INF \ MANIFEST.MF并且没有类路径条目
  • 这个特殊的罐子是由maven使用maven shade插件生成的。

解决方案(有点)

Per Dave Newton在下面的回答中,我将我的MANIFEST.MF文件更改为包含以下行:

Class-Path: ./

有了这个,我的log4j.xml文件被正确看到了。我正在使用Maven Shade插件来构建jar文件,因此添加Class-Path条目是配置ManifestResourceTransformer的问题。

<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
  <mainClass>my.runnable.Class</mainClass>
  <manifestEntries>
    <Class-Path>./</Class-Path>
  </manifestEntries>
</transformer>

我说“Sort of”已解决,因为虽然它确实输出了从我想要的log4j.xml文件配置的日志信息,但这意味着将该路径硬编码到我的jar中,任何使用我的jar的人都必须拥有log4j.xml或log4j.properties安装目录。我希望有一个更好的解决方案提供标准和预期的结果(log4j.xml / log4j.properties文件可以放在类路径的任何地方),但是我今天所做的所有搜索似乎都不是案件。

我认为我遇到了另一个令人沮丧的问题,那就是Java没有直观的行为,除了一个非常简单的解释,为什么它的行为方式涉及阅读整本书。

2 个答案:

答案 0 :(得分:2)

使用-jar时,将忽略类路径。

您可以将配置文件添加到清单的Class-Path条目,但请考虑提供路径。它可能需要是一个文件资源,否则它可能会尝试在jar的类路径值上找到它。

答案 1 :(得分:1)

对于Maven中的Eclipse测试,我发现最简单的事情就是将log4j.xml放在src/test/resources中。它将在运行单元测试等时添加到类路径中。当我们在客户站点实际安装我们的应用程序时,我们将文件放在/ etc / ...中并使用-Dlog4j.configuration指定它。

我最好猜测为什么当前目录部分不适合您,Eclipse可能是将当前目录设置为您认为不同的目录。尝试按照here的说明打印当前的工作目录,并检查它是否符合您的想法。

更新:差点忘了。指定-jar时,将忽略类路径选项(-cp -classpath)。

  

-jar

     

执行封装在JAR文件中的程序。第一个论点   是JAR文件的名称而不是启动类名称。为了   要使此选项生效,JAR文件的清单必须包含   Main-Class形式的行:classname。这里,classname标识了   类具有public static void main(String [] args)方法   作为您的应用程序的起点。请参阅Jar工具   参考页面和Java Tutorial的Jar跟踪信息   关于使用Jar文件和Jar文件清单。当你使用它   选项,JAR文件是所有用户类和其他用户的源   类路径设置被忽略。