2009-05-12 6 views
0

J'ai le problème suivant: J'ai déployé dans Tomcat un JNLP et des fichiers JAR exécutables. Le fichier JNLP devrait automatiquement télécharger le fichier JAR et l'exécuter. Le fichier JAR est signé et vérifié. Ceci est fait (la partie téléchargement). Mais quand exécuter la classe principale JAR (spécifiée dans le fichier JNLP), un problème se produit: Une partie du code de classe principal est exécutée. Par la suite, lorsqu'il tente de charger une classe dont l'instance org.apache.log4j.Logger finale est déclarée statique, elle indique une erreur. Ci-dessous sont les parties représentatives du fichier JNLP, le code et l'erreur.Pourquoi mon programme Jnlp ne fonctionne pas avec log4j?

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]. Chargeur de classe [[email protected]] utilisé dans la recherche. log4j: ERREUR Impossible d'analyser l'URL [jar: 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) at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity (source inconnue) at com.sun.org.apache .xerces.internal.impl.XMLEntityManager.startDTDEntity (source inconnue) at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.setInputSource (source inconnue) at com.sun.org.apache.xerces.internal .impl.XMLDocumentScannerImpl $ DTDDriver.dispatch (source inconnue) at com.sun.org.apache.xerces.int ernal.impl.XMLDocumentScannerImpl $ DTDDriver.next (source inconnue) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl $ PrologDriver.next (source inconnue) at com.sun.org.apache.xerces. internal.impl.XMLDocumentScannerImpl.next (source inconnue) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument (source inconnue) at com.sun.org.apache.xerces.internal.parsers. XML11Configuration.parse (source inconnue) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse (source inconnue) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse (Source inconnue) at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse (source inconnue) at com.sun.org.apache.xerces.internal.jaxp.Document BuilderImpl.parse (source inconnue) at javax.xml.parsers.DocumentBuilder.parse (source inconnue) at org.apache.log4j.xml.DOMConfigurator $ 2.parse (DOMConfigurator.java:612) at 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 native) à java.lang.Class.forName (source inconnue) à ro.codemart.installer.packer. ant.impl.nestedjar.Main.executeApplicationMainClass (Main.java:216) at ro.codemart.installer.packer.ant.impl.nestedjar.Main.main (Main.java:290) à sun.reflect.NativeMethodAccessorImpl. invoke0 (méthode native) à sun.reflect.NativeMethodAccessorImpl.invoke (source inconnue) à sun.reflect.DelegatingMethodAccessorImpl.inv oke (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 appender n'a pu être trouvé pour logger (WizardRunner). log4j: WARN Veuillez initialiser correctement le système log4j.

Merci!

Répondre

1

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

Essayez d'ajouter

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

à

<resources> 
+0

Pas tout à fait vrai. Je suis d'accord que log4j.jar n'est pas défini dans le fichier JNLP, mais ce jar est ajouté à classpath lors de l'exécution. Si ce n'était pas le cas, j'obtiendrais une exception ClassNotFoundException ou quelque chose comme ça. Merci pour votre suggestion, j'ai essayé, mais toujours le même message d'erreur! –

+0

Donc, c'était le problème. Ajout de tous mes jars dans le fichier JNLP sous la balise , comme ceci , mais sans attribut principal –

0

Si vous regardez dans votre trace de pile, la cause de l'erreur est une exception FileNotFoundException pour log4j.dtd. Regardez comment la DTD est référencée à partir de votre fichier log4j.xml. La DTD est-elle incluse dans votre fichier jar? Il doit être dans un endroit où la JVM peut le charger.

0

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

+0

Vous devez enquêter sur la raison pour laquelle il ne peut pas être chargé. Est-ce que jar log4j est dans DemoInstaller.jar car il n'est pas listé dans le fichier JNLP. – Mark

+0

Le fichier log4j.jar est ajouté dynamiquement au classpath lors de l'exécution, il n'est donc pas nécessaire de le répertorier dans le fichier JNLP. Également essayé de l'ajouter à JNLP, mais la même erreur. –

Questions connexes