Java 在当前目录中找不到log4j.xml

Java 在当前目录中找不到log4j.xml,java,log4j,Java,Log4j,我有一个可运行的jar文件 我在同一个目录中有一个log4j.xml文件 我的类路径包括“” 但是,当我运行java-jarmyrunnable.jar时,我得到以下消息 log4j:WARN No appenders could be found for logger (org.apache.commons.configuration.PropertiesConfiguration). log4j:WARN Please initialize the log4j system properly

我有一个可运行的jar文件

我在同一个目录中有一个log4j.xml文件

我的类路径包括“”

但是,当我运行
java-jarmyrunnable.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文件并使用它

我确实转到了错误消息中提到的常见问题页面。内容如下:

当无法找到默认配置文件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
添加到命令行之外,我还不知道需要做什么

如果我尝试类似于
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,没有类路径条目
  • 这个特殊的jar是由maven使用maven shade插件生成的
解决方案(有点) 根据Dave Newton下面的回答,我更改了MANIFEST.MF文件,以包含以下行:

Class-Path: ./
有了它,我的log4j.xml文件就可以正确地看到了。我正在使用Maven Shade插件来构建jar文件,因此添加类路径条目是一个配置jar文件的问题


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


我想我还遇到了另一个令人沮丧的问题,Java的行为不直观,除了一个非常简单的解释它为什么会以这种方式运行外,还需要阅读整本书。

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

关于当前目录部分不适合您的原因,我的最佳猜测是Eclipse可能正在将当前目录设置为您认为不适合的内容。尝试按照说明打印当前工作目录,并检查它是否符合您的想法

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

-罐子

执行封装在JAR文件中的程序。第一个论点 是JAR文件的名称,而不是启动类名。整齐 要使此选项起作用,JAR文件的清单必须包含 表单主类的行:classname。在这里,classname标识 具有公共静态void main(字符串[]args)方法的类 作为应用程序的起点。请参阅Jar工具 参考页面和Java教程的Jar线索以获取信息 关于使用Jar文件和Jar文件清单。当你用这个的时候 选项,JAR文件是所有用户类和其他用户类的源 将忽略类路径设置


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


可以将配置文件添加到清单的代码>类路径条目中,但是考虑提供路径。它可能需要是一个文件资源,否则它可能会试图在jar的类路径值上找到它。

但是人们不是一直在分发jar吗?人们通过java-jar运行jar,并通过log4j.xml或log4j.properties配置日志输出?难道这些人不能把配置文件放在他们自己的用户定义类路径上的任何地方吗?到目前为止,我已经在测试中这样做了,但是在eclipse中测试时,突然出现了一个错误。这是在eclipse之外的命令提示符下发生的。奇怪的是,在eclipse中,我对日志输出没有任何问题。哈!想想看,3年后,我也遇到了同样的问题。很高兴我记录了解决方案!
Class-Path: ./
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
  <mainClass>my.runnable.Class</mainClass>
  <manifestEntries>
    <Class-Path>./</Class-Path>
  </manifestEntries>
</transformer>