当前位置: 首页 > 知识库问答 >
问题:

如何找到正在为slf4j加载的jar

井誉
2023-03-14

我有一个非常奇怪的问题在Javawebstart应用程序。我正在使用slf4j和logback作为我的日志框架,但是当我的一个用户运行webstart应用程序时,他会收到一条log4j警告消息!我不包括log4j罐在webstart应用程序。log4j可能来自哪里,我如何找到?我不能导入任何log4j类并调用它们的方法,因为我不能编译一个我没有的jar文件。

以下是一些细节:

SLF4J 1.7.12 logback经典和核心1.1.3

主类如下所示:

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日志jar,它是其他jar的可传递依赖项(我不确定是哪个)。我认为这没有关系。

现在,我还有Mac OS X优胜美地10.10。我没有从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应用程序,它在类路径或java webstart加载的位置安装了log4j,这是在我的webstart应用程序之前加载的。这个jar可能位于/Library/Java/Extensions或~/Library/Java/Extensions中。

我如何找到这个log4j消息的来源?如。。。哪个jar文件以及该jar文件存储在文件系统中的什么位置?

共有1个答案

司寇望
2023-03-14

要了解slf4j桥/实现包含哪些jar或类路径条目,请在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...
    }

}
 类似资料:
  • 问题内容: 我想提供有关正在使用的JAXP实现以及从中加载哪个JAR文件的诊断信息。 实现此目的的一种方法是在的实例中创建,然后检查该类的属性: 是否有更好的方法可以实现这一目标,而不必创建一个? 问题答案: 在没有实际创建实例的情况下,很难预测将要加载哪些具体的JAXP工厂实现,因为选择实现的过程非常困难。 从官方JAXP常见问题解答(问题14)中: 当应用程序想要创建一个新的JAXP 实例时,

  • 问题内容: 好的,所以我一直在尝试使用以下代码加载BufferedImage: 但是,这在运行时给了我一个类型转换错误,那么如何正确加载BufferedImage? 问题答案: 使用来代替:

  • 问题内容: 我正在使用slf4j登录我的应用程序。我得到slf4j的目的。我想知道如何找出当前绑定到哪个日志记录库slf4j。我的引用库中有log4j。我假设slf4j已将自身绑定到log4j。 我想知道的是,有什么方法可以明确确认这种绑定吗? 问题答案: 只需执行SLF4J的操作来发现绑定: 现在,你可以尝试找出什么是实际执行的logback在我的情况: 打印:

  • 我知道使用SLF4J和Log4j2作为记录器实现应该很容易。 您只需要将jar添加到类路径中。 我原以为我是这样做的,但我现在仍在努力 我的的关键部分 然后是 然后,查看lib文件夹 但是我没有得到相应的错误消息。 我正在使用 Eclipse版本:2020-09(4.17.0) 和

  • 当我试图部署我的discord bot程序时,什么也没有发生,日志是这样写的: 我的Procfile位于存储库的根中,它有一行代码: 我在youtube上学习如何让我自己的不和机器人在Heroku上运行,我完美地复制了一切。完全相同的项目在Intellij中运行,没有错误。我如何让Heroku找到并加载我的程序?

  • 我遵循了以下步骤:如何将卷添加到现有的Docker容器(在容器上运行以将其另存为映像,并基于该映像旋转另一个容器,其中挂载了命名卷)。来自第一个容器的所有数据文件都存在于第二个容器的/var/lib/postgres/data中。 但是,当我试图查询第二个postgres数据库时,我看不到第一个容器中的任何表。几天来一直在尝试解决这个问题,但没有成功,我是不是遗漏了什么(安装一个卷是否会使/var