Pergunta

Eu tenho o seguinte problema: Eu já implantado em Tomcat um JNLP e um executável arquivos JAR. arquivo JNLP deve baixar automaticamente o arquivo JAR e executá-lo. O arquivo JAR é assinado e verificado. Isso é feito (a parte do download). Mas quando para executar a classe principal JAR (especificado no arquivo JNLP), ocorre um problema: Uma parte do código de classe principal é executado. Depois, quando ele tenta carregar uma classe que tem uma instância static final org.apache.log4j.Logger declarou, diz um erro.

Abaixo estão as partes representativas do arquivo JNLP, o código e o erro.

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

A classe principal:

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 a classe problema:

public class WizardRunner{

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

E o erro:

log4j: ERRO Não foi possível encontrar [log4j.dtd]. Usado [sun.misc.Launcher$AppClassLoader@d9f9c3] carregador de classe na pesquisa. log4j: erro não pudesse parse url [jar: http: // localhost: 8080 / examples / DemoJar.jar! /log4j.xml] . java.io.FileNotFoundException: entrada JAR não log4j.dtd encontrado em em com.sun.jnlp.JNLPCachedJarURLConnection.connect (fonte desconhecida) em com.sun.jnlp.JNLPCachedJarURLConnection.getInputStream (fonte desconhecida) em com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity (fonte desconhecida) em com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity (fonte desconhecida) em com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDTDEntity (fonte desconhecida) em com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.setInputSource (fonte desconhecida) em com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl $ DTDDriver.dispatch (fonte desconhecida) em com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl $ DTDDriver.next (fonte desconhecida) em com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl $ PrologDriver.next (fonte desconhecida) em com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next (fonte desconhecida) em com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument (fonte desconhecida) em com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse (fonte desconhecida) em com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse (fonte desconhecida) em com.sun.org.apache.xerces.internal.parsers.XMLParser.parse (fonte desconhecida) em com.sun.org.apache.xerces.internal.parsers.DOMParser.parse (fonte desconhecida) em com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse (fonte desconhecida) em javax.xml.parsers.DocumentBuilder.parse (fonte desconhecida) em org.apache.log4j.xml.DOMConfigurator $ 2.parse (DOMConfigurator.java:612) em org.apache.log4j.xml.DOMConfigurator.doConfigure (DOMConfigurator.java:711) em org.apache.log4j.xml.DOMConfigurator.doConfigure (DOMConfigurator.java:618) em org.apache.log4j.helpers.OptionConverter.selectAndConfigure (OptionConverter.java:470) em org.apache.log4j.LogManager. (LogManager.java:122) em org.apache.log4j.Logger.getLogger (Logger.java:117) em ro.codemart.installer.wizard.WizardRunner. (WizardRunner.java:38) em java.lang.Class.forName0 (Método Nativo) em Java.Lang.Class.forName (fonte desconhecida) em ro.codemart.installer.packer.ant.impl.nestedjar.Main.executeApplicationMainClass (Main.java:216) em ro.codemart.installer.packer.ant.impl.nestedjar.Main.main (Main.java:290) em sun.reflect.NativeMethodAccessorImpl.invoke0 (Método Nativo) em sun.reflect.NativeMethodAccessorImpl.invoke (fonte desconhecida) em sun.reflect.DelegatingMethodAccessorImpl.invoke (fonte desconhecida) em java.lang.reflect.Method.invoke (fonte desconhecida) em com.sun.javaws.Launcher.executeApplication (fonte desconhecida) em com.sun.javaws.Launcher.executeMainClass (desconhecidonown Fonte) em com.sun.javaws.Launcher.doLaunchApp (fonte desconhecida) em com.sun.javaws.Launcher.run (fonte desconhecida) em java.lang.Thread.run (fonte desconhecida) log4j: WARN Não appenders poderia ser encontrado para logger (WizardRunner). log4j:. WARN Por favor, inicializar o sistema log4j corretamente

Obrigado!

Foi útil?

Solução

Eu acho que o problema está faltando log4j.jar - não é especificado ou carregado pelo arquivo .jnlp. Você mencionou na resposta anterior que está em seu caminho de classe, mas como se você estiver executando via WebStart? Eu acredito que o seu classpath é limitado ao que está definido no arquivo .jnlp.

Tente adicionar

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

para

<resources>

Outras dicas

Se você olhar no seu rastreamento de pilha a causa do erro é um FileNotFoundException para log4j.dtd. Olha como o DTD é referenciado a partir de sua log4j.xml. É o DTD incluído no seu arquivo jar? Ele precisa estar em um lugar onde o JVM pode carregá-lo.

Sim, o log4j.dtd arquivo vem embutido com log4j-1.2.12.jar . Além disso, este jar log4j está no classpath.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top