Почему моя программа 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)


arrow_upward
1
arrow_downward

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

Если вы посмотрите на трассировку стека, причиной ошибки является исключение 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

arrow_upward
0
arrow_downward

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

person Mark    schedule 12.05.2009

arrow_upward
0
arrow_downward

Не совсем верно. Я согласен с тем, что 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