我有一个可运行的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文件并使用它。
我确实转到了错误消息中提到的FAQ页面。内容如下:
当找不到默认配置文件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 .\\
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没有直观的行为,除了一个非常简单的解释,为什么它的行为方式涉及阅读整本书。
答案 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文件是所有用户类和其他用户的源 类路径设置被忽略。