Java 为什么我的Jnlp程序不能与log4j一起工作?

Java 为什么我的Jnlp程序不能与log4j一起工作?,java,log4j,jnlp,Java,Log4j,Jnlp,我有以下问题: 我在Tomcat中部署了一个JNLP和一个可执行JAR文件。JNLP文件应该自动下载JAR文件并执行它。JAR文件经过签名和验证。 这已经完成(下载部分)。 但是当执行JAR主类(在JNLP文件中指定)时,会出现一个问题: 执行主类代码的一部分。之后,当它试图加载一个声明了静态最终org.apache.log4j.Logger实例的类时,它会说一个错误 下面是JNLP文件的代表部分、代码和错误 JNLP <?xml version='1.0' encoding='UTF-8

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

下面是JNLP文件的代表部分、代码和错误

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 WizardRunner{

    private final static Logger log = Logger.getLogger(WizardRunner.class);
...
}
和错误:

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});      
    ...
   }
}
log4j:找不到[log4j.dtd]时出错。已使用[sun.misc.Launcher]$AppClassLoader@d9f9c3]搜索中的类加载器。 log4j:错误无法分析url[jar:。 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.startenty(未知来源) 位于com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startdentity(未知源) 位于com.sun.org.apache.xerces.internal.impl.xmldtddscannerimpl.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.ScandDocument(未知来源) 位于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.domconfigure(DOMConfigurator.java:711) 位于org.apache.log4j.xml.domconfigure(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:警告请正确初始化log4j系统


谢谢!

如果查看堆栈跟踪,则错误的原因是log4j.dtd的FileNotFoundException。请查看如何从log4j.xml引用dtd。dtd是否包含在jar文件中?它需要位于JVM可以加载它的位置。

是的,log4j.dtd文件嵌入了log4j-1.2.12.jar。这个log4j jar也在类路径中。

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

尝试添加

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



因此您需要调查为什么无法加载它。log4j.jar是否在DemoInstaller.jar中,因为它没有列在JNLP文件中。log4j.jar文件在运行时动态添加到类路径中,所以不需要列在JNLP文件中。您也尝试将其添加到JNLP中,但出现了相同的错误。不完全正确。我同意log4j.jar没有在JNLP中定义文件,但这个jar是在运行时添加到类路径的。如果不是这样,我会得到一个ClassNotFoundException或类似的东西。谢谢你的建议,我已经尝试过了,但仍然有相同的错误消息!所以,这就是问题所在。将我所有的jar添加到标记下的JNLP文件中,像这样,但没有主属性
<resources>