如何找出正在为 slf4j 加载的 jar
how to find out which jar is being loaded for slf4j
我在 Java webstart 应用程序中遇到了一个非常奇怪的问题。我正在为我的日志记录框架使用 slf4j 和 logback,但是当我的一个用户 运行 使用 webstart 应用程序时,他收到一条 log4j 警告消息!我没有在 webstart 应用程序中包含 log4j jar。 log4j 可能来自哪里,我如何知道?我无法导入任何 log4j classes 并调用它们的方法,因为我无法针对我没有的 jar 文件进行编译。
这里有一些细节:
slf4j 1.7.12
logback classic 和核心 1.1.3
主要 class 看起来像这样:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyMain {
static {
String classpath = System.getProperty("java.class.path");
System.out.println("CLASSPATH = " + classpath);
}
private final static Logger LOG = LoggerFactory.getLogger(MyMain.class);
public void static main( String args[] ) {
// do stuff...
}
}
这个程序在我的用户 Mac OS X Yosemite 10.10.3 上的输出是(记住它是一个 webstart 程序并且有一个 JNLP 文件从浏览器):
CLASSPATH = /Library/Internet Plugins/JavaAppletPlugin.plugin/Contents/Home/lib/deploy.jar
log4j:WARN No appenders could be found for logger (MyMain).
log4j:WARN Please initialize the log4j system properly.
这是 JNLP 文件:
<jnlp spec="6.0" codebase="http://example.com/mymain">
<information>
<title>MyMain</title>
<vendor>My Business</vendor>
<homepage href="http://www.example.com"/>
<description>My Application</description>
<description kind="short">GUI Tool</description>
<icon href="resources/your.appicon.gif"/>
<icon kind="splash" href="resources/your.splashicon.gif"/>
<offline-allowed/>
</information>
<resources>
<j2se version="1.8+" max-heap-size="1024M"/>
<jar href="mymain.jar" main="true"/>
<jar href="tsallperspectives63dep.jar"/>
<jar href="activation-1.1.jar"/>
<jar href="antlr-runtime.jar"/>
<jar href="appframework-1.0.3.jar"/>
<jar href="asm-all-repackaged-2.1.88.jar"/>
<jar href="asm-all-repackaged-2.2.0-b21.jar"/>
<jar href="batik.jar"/>
<jar href="beansbinding-1.2.1.jar"/>
<jar href="cglib-2.1.88.jar"/>
<jar href="cglib-2.2.0-b21.jar"/>
<jar href="common.jar"/>
<jar href="commonj.sdo-2.1.1.jar"/>
<jar href="commons-beanutils-1.8.3.jar"/>
<jar href="commons-codec-1.6.jar"/>
<jar href="commons-lang3-3.4.jar"/>
<jar href="commons-logging-1.1.3.jar"/>
<jar href="derbyclient.jar"/>
<jar href="dom4j-1.6.1.jar"/>
<jar href="eclipselink-2.5.0.jar"/>
<jar href="guava-14.0.1.jar"/>
<jar href="hk2-api-2.1.88.jar"/>
<jar href="hk2-api-2.2.0-b21.jar"/>
<jar href="hk2-locator-2.1.88.jar"/>
<jar href="hk2-locator-2.2.0-b21.jar"/>
<jar href="hk2-utils-2.1.88.jar"/>
<jar href="hk2-utils-2.2.0-b21.jar"/>
<jar href="httpclient-4.3.5.jar"/>
<jar href="httpcore-4.3.2.jar"/>
<jar href="iText.jar"/>
<jar href="javaee-api-7.0.jar"/>
<jar href="javax.annotation-api-1.2.jar"/>
<jar href="javax.inject-1.jar"/>
<jar href="javax.inject-2.1.88.jar"/>
<jar href="javax.inject-2.2.0-b21.jar"/>
<jar href="javax.mail-1.5.0.jar"/>
<jar href="javax.persistence-2.1.0.jar"/>
<jar href="javax.ws.rs-api-2.0.jar"/>
<jar href="jcommon-1.0.17.jar"/>
<jar href="jersey-client-2.0.jar"/>
<jar href="jersey-client-2.4.1.jar"/>
<jar href="jersey-common-2.0.jar"/>
<jar href="jersey-common-2.4.1.jar"/>
<jar href="jfreechart-1.0.14.jar"/>
<jar href="jfreesvg-2.1.jar"/>
<jar href="jsse.jar"/>
<jar href="jul-to-slf4j-1.7.12.jar"/>
<jar href="junit-3.8.1.jar"/>
<jar href="logback-classic-1.1.3.jar"/>
<jar href="logback-core-1.1.3.jar"/>
<jar href="ojdbc6.jar"/>
<jar href="ojpse.jar"/>
<jar href="oraclepki.jar"/>
<jar href="oraclepki103.jar"/>
<jar href="osdt_cert.jar"/>
<jar href="osdt_core.jar"/>
<jar href="osgi-resource-locator-1.0.1.jar"/>
<jar href="poi.jar"/>
<jar href="serializer.jar"/>
<jar href="slf4j-api-1.7.12.jar"/>
<jar href="sso.jar"/>
<jar href="swing-layout-1.0.4.jar"/>
<jar href="swing-worker-1.1.jar"/>
<jar href="xalan.jar"/>
<jar href="xmlbeans-2.3.0.jar"/>
</resources>
<application-desc main-class="MyMain">
<argument>-h</argument>
<argument>example.com</argument>
<argument>-u</argument>
<argument>user</argument>
<argument>-p</argument>
<argument>pass</argument>
</application-desc>
<security>
<all-permissions/>
</security>
</jnlp>
注意,有一个 commons-logging jar,它是其他一些 jar(我不确定是哪个)的传递依赖项。我不认为这是相关的。
现在,我还有 Mac OS X Yosemite 10.10.3 并且我没有从 log4j 收到任何警告...我得到了我期望的输出:
CLASSPATH = /Library/Internet Plug-ins/JavaAppletPlugin.plugin/Contents/Home/lib/deploy.jar
20:51:43,748 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
20:51:43,750 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
20:51:43,750 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [jar:http://example.com/mymain/mymain.jar!/logback.xml]
我知道另外两个 Mac OS X 系统正确 运行 这个 webstart 应用程序,没有其他像这个用户的系统那样失败。
所有系统都运行宁Java1.8.0更新45.
我能想到的唯一可能的事情是我的用户系统有一些其他 java 应用程序在 class 路径或 [=42] 加载的位置安装了 log4j =] webstart,这是在我的 webstart 应用程序之前加载的。可能这个罐子在 /Library/Java/Extensions 或 ~/Library/Java/Extensions.
如何找出此 log4j 消息的来源?如...哪个 jar 文件以及该 jar 文件存储在文件系统中的什么位置?
要找出哪个 jar 或类路径条目具有 slf4j bridge/implementation,请在 MyMain
.
中使用以下代码
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.ILoggerFactory;
public class MyMain {
static {
ILoggerFactory lf = binder.getLoggerFactory();
Class lfc = lf.getClass();
System.out.println(lfc.getResource(lfc.getSimpleName() + ".class"));
}
private final static Logger LOG = LoggerFactory.getLogger(MyMain.class);
public void static main( String args[] ) {
// do stuff...
}
}
我在 Java webstart 应用程序中遇到了一个非常奇怪的问题。我正在为我的日志记录框架使用 slf4j 和 logback,但是当我的一个用户 运行 使用 webstart 应用程序时,他收到一条 log4j 警告消息!我没有在 webstart 应用程序中包含 log4j jar。 log4j 可能来自哪里,我如何知道?我无法导入任何 log4j classes 并调用它们的方法,因为我无法针对我没有的 jar 文件进行编译。
这里有一些细节:
slf4j 1.7.12 logback classic 和核心 1.1.3
主要 class 看起来像这样:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyMain {
static {
String classpath = System.getProperty("java.class.path");
System.out.println("CLASSPATH = " + classpath);
}
private final static Logger LOG = LoggerFactory.getLogger(MyMain.class);
public void static main( String args[] ) {
// do stuff...
}
}
这个程序在我的用户 Mac OS X Yosemite 10.10.3 上的输出是(记住它是一个 webstart 程序并且有一个 JNLP 文件从浏览器):
CLASSPATH = /Library/Internet Plugins/JavaAppletPlugin.plugin/Contents/Home/lib/deploy.jar
log4j:WARN No appenders could be found for logger (MyMain).
log4j:WARN Please initialize the log4j system properly.
这是 JNLP 文件:
<jnlp spec="6.0" codebase="http://example.com/mymain">
<information>
<title>MyMain</title>
<vendor>My Business</vendor>
<homepage href="http://www.example.com"/>
<description>My Application</description>
<description kind="short">GUI Tool</description>
<icon href="resources/your.appicon.gif"/>
<icon kind="splash" href="resources/your.splashicon.gif"/>
<offline-allowed/>
</information>
<resources>
<j2se version="1.8+" max-heap-size="1024M"/>
<jar href="mymain.jar" main="true"/>
<jar href="tsallperspectives63dep.jar"/>
<jar href="activation-1.1.jar"/>
<jar href="antlr-runtime.jar"/>
<jar href="appframework-1.0.3.jar"/>
<jar href="asm-all-repackaged-2.1.88.jar"/>
<jar href="asm-all-repackaged-2.2.0-b21.jar"/>
<jar href="batik.jar"/>
<jar href="beansbinding-1.2.1.jar"/>
<jar href="cglib-2.1.88.jar"/>
<jar href="cglib-2.2.0-b21.jar"/>
<jar href="common.jar"/>
<jar href="commonj.sdo-2.1.1.jar"/>
<jar href="commons-beanutils-1.8.3.jar"/>
<jar href="commons-codec-1.6.jar"/>
<jar href="commons-lang3-3.4.jar"/>
<jar href="commons-logging-1.1.3.jar"/>
<jar href="derbyclient.jar"/>
<jar href="dom4j-1.6.1.jar"/>
<jar href="eclipselink-2.5.0.jar"/>
<jar href="guava-14.0.1.jar"/>
<jar href="hk2-api-2.1.88.jar"/>
<jar href="hk2-api-2.2.0-b21.jar"/>
<jar href="hk2-locator-2.1.88.jar"/>
<jar href="hk2-locator-2.2.0-b21.jar"/>
<jar href="hk2-utils-2.1.88.jar"/>
<jar href="hk2-utils-2.2.0-b21.jar"/>
<jar href="httpclient-4.3.5.jar"/>
<jar href="httpcore-4.3.2.jar"/>
<jar href="iText.jar"/>
<jar href="javaee-api-7.0.jar"/>
<jar href="javax.annotation-api-1.2.jar"/>
<jar href="javax.inject-1.jar"/>
<jar href="javax.inject-2.1.88.jar"/>
<jar href="javax.inject-2.2.0-b21.jar"/>
<jar href="javax.mail-1.5.0.jar"/>
<jar href="javax.persistence-2.1.0.jar"/>
<jar href="javax.ws.rs-api-2.0.jar"/>
<jar href="jcommon-1.0.17.jar"/>
<jar href="jersey-client-2.0.jar"/>
<jar href="jersey-client-2.4.1.jar"/>
<jar href="jersey-common-2.0.jar"/>
<jar href="jersey-common-2.4.1.jar"/>
<jar href="jfreechart-1.0.14.jar"/>
<jar href="jfreesvg-2.1.jar"/>
<jar href="jsse.jar"/>
<jar href="jul-to-slf4j-1.7.12.jar"/>
<jar href="junit-3.8.1.jar"/>
<jar href="logback-classic-1.1.3.jar"/>
<jar href="logback-core-1.1.3.jar"/>
<jar href="ojdbc6.jar"/>
<jar href="ojpse.jar"/>
<jar href="oraclepki.jar"/>
<jar href="oraclepki103.jar"/>
<jar href="osdt_cert.jar"/>
<jar href="osdt_core.jar"/>
<jar href="osgi-resource-locator-1.0.1.jar"/>
<jar href="poi.jar"/>
<jar href="serializer.jar"/>
<jar href="slf4j-api-1.7.12.jar"/>
<jar href="sso.jar"/>
<jar href="swing-layout-1.0.4.jar"/>
<jar href="swing-worker-1.1.jar"/>
<jar href="xalan.jar"/>
<jar href="xmlbeans-2.3.0.jar"/>
</resources>
<application-desc main-class="MyMain">
<argument>-h</argument>
<argument>example.com</argument>
<argument>-u</argument>
<argument>user</argument>
<argument>-p</argument>
<argument>pass</argument>
</application-desc>
<security>
<all-permissions/>
</security>
</jnlp>
注意,有一个 commons-logging jar,它是其他一些 jar(我不确定是哪个)的传递依赖项。我不认为这是相关的。
现在,我还有 Mac OS X Yosemite 10.10.3 并且我没有从 log4j 收到任何警告...我得到了我期望的输出:
CLASSPATH = /Library/Internet Plug-ins/JavaAppletPlugin.plugin/Contents/Home/lib/deploy.jar
20:51:43,748 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
20:51:43,750 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
20:51:43,750 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [jar:http://example.com/mymain/mymain.jar!/logback.xml]
我知道另外两个 Mac OS X 系统正确 运行 这个 webstart 应用程序,没有其他像这个用户的系统那样失败。
所有系统都运行宁Java1.8.0更新45.
我能想到的唯一可能的事情是我的用户系统有一些其他 java 应用程序在 class 路径或 [=42] 加载的位置安装了 log4j =] webstart,这是在我的 webstart 应用程序之前加载的。可能这个罐子在 /Library/Java/Extensions 或 ~/Library/Java/Extensions.
如何找出此 log4j 消息的来源?如...哪个 jar 文件以及该 jar 文件存储在文件系统中的什么位置?
要找出哪个 jar 或类路径条目具有 slf4j bridge/implementation,请在 MyMain
.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.ILoggerFactory;
public class MyMain {
static {
ILoggerFactory lf = binder.getLoggerFactory();
Class lfc = lf.getClass();
System.out.println(lfc.getResource(lfc.getSimpleName() + ".class"));
}
private final static Logger LOG = LoggerFactory.getLogger(MyMain.class);
public void static main( String args[] ) {
// do stuff...
}
}