java - 为什么我的Jnlp程序不能与log4j一起使用?

标签 java log4j jnlp

我有以下问题:
我已经在Tomcat中部署了一个JNLP和一个可执行的JAR文件。 JNLP文件应自动下载JAR文件并执行。 JAR文件已签名并验证。
完成了(下载部分)。
但是,当执行JAR主类(在JNLP文件中指定)时,会出现问题:
主类代码的一部分被执行。之后,当它尝试加载具有静态最终org.apache.log4j.Logger实例声明的类时,它会显示错误。

以下是JNLP文件的代表性部分,代码和错误。

国民党

<?xml version='1.0' encoding='UTF-8'?>
<jnlp spec="1.5+" codebase="http://localhost:8080/examples" href="DemoInstaller.jnlp" download="eager" main="true">
    <information>
        <title>Demo Installer</title>
        <vendor>Codemart [www.codemart.ro]</vendor>
        <homepage>https://sourceforge.net/projects/cminstall/</homepage>
        <description>This is a demo installer built using Codemart Installer framework with JavaFX</description>
        <description kind="tooltip">Codemart Demo Installer</description>
        <offline-allowed />
        <shortcut online="true">
            <desktop />
        </shortcut>
    </information>

<security>
    <all-permissions />
</security>

<update check="background" />

<resources>
    <j2se href="http://java.sun.com/products/autodl/j2se" version="1.6+" />
            <jar href="DemoInstaller.jar" main="true" download="eager" />
</resources>

<application-desc main-class="ro.codemart.installer.packer.ant.impl.nestedjar.Main" />




主班:

public class Main {
 public static void main(String[] args) throws Exception {
     final Main main = new Main();
     //this is the problem class !
     Class clazz = Class.forName("WizardRunner");
     Method m = clazz.getMethod("main", new Class[]{args.getClass()});
     m.invoke(null, new Object[]{args});      
    ...
   }
}


和问题类:

public class WizardRunner{

    private final static Logger log = Logger.getLogger(WizardRunner.class);
...
}


错误:

log4j:ERROR找不到[log4j.dtd]。搜索中使用的[sun.misc.Launcher$AppClassLoader@d9f9c3]类加载器。
log4j:ERROR无法解析URL [jar:http://localhost:8080/examples/DemoJar.jar!/log4j.xml]
java.io.FileNotFoundException:在以下位置找不到JAR条目log4j.dtd
在com.sun.jnlp.JNLPCachedJarURLConnection.connect(未知来源)
com.sun.jnlp.JNLPCachedJarURLConnection.getInputStream(未知来源)
在com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(未知来源)
在com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(未知来源)
在com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDTDEntity(未知来源)
在com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.setInputSource(未知源)
com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl $ DTDDriver.dispatch(未知来源)
在com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl $ DTDDriver.next(未知来源)
在com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl $ PrologDriver.next(未知来源)
在com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(未知来源)
在com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(未知来源)
在com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(未知来源)
在com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(未知来源)
在com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(未知来源)
在com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(未知来源)
在com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(未知来源)
在javax.xml.parsers.DocumentBuilder.parse(未知来源)
在org.apache.log4j.xml.DOMConfigurator $ 2.parse(DOMConfigurator.java:612)
在org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:711)
在org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:618)
在org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:470)
在org.apache.log4j.LogManager。(LogManager.java:122)
在org.apache.log4j.Logger.getLogger(Logger.java:117)
在ro.codemart.installer.wizard.WizardRunner。(WizardRunner.java:38)
在java.lang.Class.forName0(本地方法)
在java.lang.Class.forName(未知来源)
在ro.codemart.installer.packer.ant.impl.nestedjar.Main.executeApplicationMainClass(Main.java:216)
在ro.codemart.installer.packer.ant.impl.nestedjar.Main.main(Main.java:290)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)
在java.lang.reflect.Method.invoke(未知来源)
在com.sun.javaws.Launcher.executeApplication(未知来源)
在com.sun.javaws.Launcher.executeMainClass(未知来源)
在com.sun.javaws.Launcher.doLaunchApp(未知来源)
在com.sun.javaws.Launcher.run(未知来源)
在java.lang.Thread.run(未知来源)
log4j:WARN找不到记录器(WizardRunner)的附加程序。
log4j:WARN请正确初始化log4j系统。

谢谢!

最佳答案

我认为问题是缺少log4j.jar-未由.jnlp文件指定或加载。您在上一个答案中提到它在您的类路径中,但是如果您通过WebStart运行该怎么办?我相信您的类路径仅限于.jnlp文件中定义的内容。

尝试添加

<jar href="log4j.jar" main="true" download="eager" />




<resources>

关于java - 为什么我的Jnlp程序不能与log4j一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/852089/

相关文章:

java - Apache Poi : get page count in DOC document

java - 如何在可执行 JAR 中加载 TestNG 配置?

java - 是否可以更改我的包中的 log4j 级别,但不能使用例如 spring 更改 api 的 IM 中的级别

java - log4j 不使用 websphere 登录 AIX

java - 在没有互联网连接的网络中生产环境中通过 JNLP 应用程序启动缓慢

javascript - Cordova PhoneGap 从 2.2.0 升级到 5.1.1

java - 如何将 alt 属性传递给 Servlet

Java slf4j实现: logback vs log4j

java - 在 JDK 1.7 中找不到 jnlp.jar

java - 如何在java中获取启动jnlp文件名/目录?