Domanda

Ho il seguente problema: Ho distribuito in Tomcat un JNLP e un file JAR eseguibile. file JNLP dovrebbe scaricare automaticamente il file JAR ed eseguirlo. Il file JAR è firmato e verificato. Questo viene fatto (la parte scaricamento). Ma quando per eseguire la classe principale JAR (specificato nel file JNLP), si verifica un problema: viene eseguita Una parte del codice della classe principale. In seguito, quando si tenta di caricare una classe che dispone di un'istanza org.apache.log4j.Logger finale statica dichiarata, dice un errore.

Di seguito sono le parti rappresentative del file JNLP, il codice e l'errore.

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" />

La classe principale:

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});      
    ...
   }
}

E la classe problema:

public class WizardRunner{

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

E l'errore:

log4j: ERRORE impossibile trovare [log4j.dtd]. Usato: [sun.misc.Launcher$AppClassLoader@d9f9c3] class loader nella ricerca. log4j: ERRORE Impossibile analizzare url [jar: http: // localhost: 8080 / examples / DemoJar.jar! /log4j.xml] . java.io.FileNotFoundException: ingresso JAR non log4j.dtd trovato in     a com.sun.jnlp.JNLPCachedJarURLConnection.connect (fonte sconosciuta)     a com.sun.jnlp.JNLPCachedJarURLConnection.getInputStream (fonte sconosciuta)     a com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity (fonte sconosciuta)     a com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity (fonte sconosciuta)     a com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDTDEntity (fonte sconosciuta)     a com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.setInputSource (fonte sconosciuta)     a com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl $ DTDDriver.dispatch (fonte sconosciuta)     a com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl $ DTDDriver.next (fonte sconosciuta)     a com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl $ PrologDriver.next (fonte sconosciuta)     a com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next (fonte sconosciuta)     a com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument (fonte sconosciuta)     a com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse (fonte sconosciuta)     a com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse (fonte sconosciuta)     a com.sun.org.apache.xerces.internal.parsers.XMLParser.parse (fonte sconosciuta)     a com.sun.org.apache.xerces.internal.parsers.DOMParser.parse (fonte sconosciuta)     a com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse (fonte sconosciuta)     a javax.xml.parsers.DocumentBuilder.parse (fonte sconosciuta)     a org.apache.log4j.xml.DOMConfigurator $ 2.parse (DOMConfigurator.java:612)     a org.apache.log4j.xml.DOMConfigurator.doConfigure (DOMConfigurator.java:711)     a org.apache.log4j.xml.DOMConfigurator.doConfigure (DOMConfigurator.java:618)     a org.apache.log4j.helpers.OptionConverter.selectAndConfigure (OptionConverter.java:470)     a org.apache.log4j.LogManager. (LogManager.java:122)     a org.apache.log4j.Logger.getLogger (Logger.java:117)     a ro.codemart.installer.wizard.WizardRunner. (WizardRunner.java:38)     a java.lang.Class.forName0 (metodo natale)     a java.lang.Class.forName (fonte sconosciuta)     a ro.codemart.installer.packer.ant.impl.nestedjar.Main.executeApplicationMainClass (Main.java:216)     a ro.codemart.installer.packer.ant.impl.nestedjar.Main.main (Main.java:290)     a sun.reflect.NativeMethodAccessorImpl.invoke0 (metodo natale)     a sun.reflect.NativeMethodAccessorImpl.invoke (fonte sconosciuta)     a sun.reflect.DelegatingMethodAccessorImpl.invoke (fonte sconosciuta)     a java.lang.reflect.Method.invoke (fonte sconosciuta)     a com.sun.javaws.Launcher.executeApplication (fonte sconosciuta)     a com.sun.javaws.Launcher.executeMainClass (fonte sconosciuta)     a com.sun.javaws.Launcher.doLaunchApp (fonte sconosciuta)     a com.sun.javaws.Launcher.run (fonte sconosciuta)     a java.lang.Thread.run (fonte sconosciuta) log4j: WARN Nessun appenders potrebbero essere trovati per logger (WizardRunner). log4j:. WARN Si prega di inizializzare il sistema log4j correttamente

Grazie!

È stato utile?

Soluzione

Credo che il problema non è presente log4j.jar - non è specificato o caricato dal file .jnlp. Lei ha citato nella risposta precedente che è nel vostro percorso di classe, ma come se si sta eseguendo via WebStart? Credo che il vostro percorso di classe è limitato a ciò che è definito nel file .jnlp.

Prova ad aggiungere

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

a

<resources>

Altri suggerimenti

Se si guarda nel tuo stack rintracciare la causa dell'errore è un FileNotFoundException per log4j.dtd. Guardate come DTD viene fatto riferimento dal log4j.xml. È la DTD incluso nel file jar? Ha bisogno di essere in un luogo dove la JVM può caricarlo.

Sì, il log4j.dtd file viene integrato con log4j-1.2.12.jar . Anche questo vaso log4j è nel classpath.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top