我有以下问题:我已经在 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:错误找不到 [log4j.dtd]。在搜索中使用了 [sun.misc.Launcher$AppClassLoader@d9f9c3] 类加载器。log4j:错误无法解析 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:警告 找不到记录器 (WizardRunner) 的追加程序。log4j:WARN 请正确初始化 log4j 系统。

谢谢你!

有帮助吗?

解决方案

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

尝试添加

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

<resources>

其他提示

如果您在您的堆栈跟踪误差的原因看起来是一个log4j.dtd FileNotFoundException异常。怎么看待DTD是从您的log4j.xml引用。包括在你的jar文件的DTD?它需要在将JVM可以加载它的地方。

是,在 log4j.dtd 文件自带嵌入的的log4j-1.2.12.jar 即可。这也log4j的罐子是在类路径。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top