Почему моя программа Jnlp не работает с log4j?

У меня следующая проблема: я развернул в 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" />

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

И класс задач:

public class WizardRunner{

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

И ошибка:

Спасибо!

Я думаю, что проблема в отсутствии log4j.jar - он не указан или не загружен файлом .jnlp. В предыдущем ответе вы упомянули, что он находится в вашем пути к классам, но что, если вы работаете через WebStart? Я считаю, что ваш путь к классам ограничен тем, что определено в файле .jnlp.


person Community    schedule 12.05.2009    source источник


Ответы (3)


Попробуйте добавить

Если вы посмотрите на трассировку стека, причиной ошибки является исключение FileNotFoundException для log4j.dtd. Посмотрите, как DTD ссылается на ваш log4j.xml. Включено ли DTD в ваш файл jar? Он должен находиться в месте, где JVM сможет его загрузить.

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

to

<resources>
person G__    schedule 12.05.2009
comment
Итак, это была проблема. Добавление всех моих банок в файл JNLP под тегом ‹resources›, например, ‹jar href=yourJar.jar›, но без основного атрибута - person ; 13.05.2009
comment
Поэтому вам нужно выяснить, почему он не может быть загружен. Является ли файл log4j jar внутри DemoInstaller.jar, поскольку он не указан в файле JNLP. - person ; 15.05.2009

Да, файл log4j.dtd поставляется вместе с log4j-1.2.12.jar. Также эта банка log4j находится в пути к классам.

person Mark    schedule 12.05.2009

Не совсем верно. Я согласен с тем, что log4j.jar не определен в файле JNLP, но этот jar добавляется в путь к классам во время выполнения. Если бы это было не так, я бы получил ClassNotFoundException или что-то в этом роде. Спасибо за ваше предложение, я попробовал, но сообщение об ошибке все равно такое же!

person Flueras Bogdan    schedule 12.05.2009
comment
Файл log4j.jar динамически добавляется в путь к классам во время выполнения, поэтому нет необходимости указывать его в файле JNLP. Также пытался добавить его в JNLP, но та же ошибка. - person Mark; 12.05.2009
comment
log4j:ERROR Не удалось найти [log4j.dtd]. В поиске использовался загрузчик классов [sun.misc.Launcher$AppClassLoader@d9f9c3]. log4j:ERROR Не удалось проанализировать URL-адрес [jar:http://localhost:8080/examples/DemoJar.jar!/log4j.xml]. 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.startEntity(неизвестный источник) на com.sun.org.apache.xerces.internal.impl .XMLEntityManager.startDTDEntity(неизвестный источник) в com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.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.scanDocument (неизвестный источник) на 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.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(собственный метод) в 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:WARN Не удалось найти приложения для регистратора (WizardRunner). log4j:WARN Пожалуйста, правильно инициализируйте систему log4j. - person ; 13.05.2009