Question

J'ai le problème suivant: J'ai déployé dans Tomcat un JNLP et un fichier JAR exécutables. fichier JNLP doit télécharger automatiquement le fichier JAR et l'exécuter. Le fichier JAR est signé et vérifié. Ceci est fait (la partie de téléchargement). Mais quand exécuter la classe principale JAR (spécifié dans le fichier JNLP), un problème se produit: Une partie du code principal de classe est exécutée. Par la suite, quand il tente de charger une classe qui a une dernière instance org.apache.log4j.Logger statique déclarée, il dit une erreur.

Voici les parties représentatives du fichier JNLP, le code et l'erreur.

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

Et la classe problème:

public class WizardRunner{

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

Et l'erreur:

log4j: ERREUR Impossible trouver [log4j.dtd]. Utilisé [sun.misc.Launcher$AppClassLoader@d9f9c3] chargeur de classe dans la recherche. log4j: ERREUR Impossible d'analyser jar url [: http: // localhost: 8080 / examples / DemoJar.jar! /log4j.xml] . java.io.FileNotFoundException: entrée JAR log4j.dtd ne se trouve pas dans     à com.sun.jnlp.JNLPCachedJarURLConnection.connect (Source inconnue)     à com.sun.jnlp.JNLPCachedJarURLConnection.getInputStream (Source inconnue)     à com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity (Source inconnue)     à com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity (Source inconnue)     à com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDTDEntity (Source inconnue)     à com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.setInputSource (Source inconnue)     à com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl $ DTDDriver.dispatch (Source inconnue)     à com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl $ DTDDriver.next (Source inconnue)     à com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl $ PrologDriver.next (Source inconnue)     à com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next (Source inconnue)     à com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument (Source inconnue)     à com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse (Source inconnue)     à com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse (Source inconnue)     à com.sun.org.apache.xerces.internal.parsers.XMLParser.parse (Source inconnue)     à com.sun.org.apache.xerces.internal.parsers.DOMParser.parse (Source inconnue)     à com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse (Source inconnue)     à javax.xml.parsers.DocumentBuilder.parse (Source inconnue)     à 2.parse org.apache.log4j.xml.DOMConfigurator $ (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 (Méthode natif)     à java.lang.Class.forName (Source inconnue)     à 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 (Méthode natif)     à sun.reflect.NativeMethodAccessorImpl.invoke (Source inconnue)     à sun.reflect.DelegatingMethodAccessorImpl.invoke (Source inconnue)     à java.lang.reflect.Method.invoke (Source inconnue)     à com.sun.javaws.Launcher.executeApplication (Source inconnue)     à com.sun.javaws.Launcher.executeMainClass (Source inconnue)     à com.sun.javaws.Launcher.doLaunchApp (Source inconnue)     à com.sun.javaws.Launcher.run (Source inconnue)     à java.lang.Thread.run (Source inconnue) log4j: WARN Aucun appenders n'a pu être trouvée pour enregistreur (WizardRunner). log4j:. WARN S'il vous plaît initialiser le système log4j correctement

Merci!

Était-ce utile?

La solution

Je pense que le problème est absent log4j.jar - il n'est pas spécifié ou chargé par le fichier .jnlp. Vous avez mentionné dans la réponse précédente qu'il est dans votre classpath, mais comment si vous utilisez via WebStart? Je crois que votre classpath est limitée à ce qui est défini dans le fichier .jnlp.

Essayez d'ajouter

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

à

<resources>

Autres conseils

Si vous regardez dans votre pile trace la cause de l'erreur est une FileNotFoundException pour log4j.dtd. Regardez comment la DTD est référencé à partir de votre log4j.xml. Est-ce la DTD inclus dans votre fichier jar? Il doit être dans un endroit où la machine virtuelle Java peut charger.

Oui, log4j.dtd fichier est livré avec les log4j-1.2.12.jar . Aussi ce pot log4j est dans le classpath.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top