我有以下问题: 我在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" />
主要课程:
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:错误找不到[log4j.dtd]。在搜索中使用[sun.misc.Launcher$AppClassLoader@d9f9c3]类加载器。 log4j:错误无法解析url [jar:http://localhost:8080/examples/DemoJar.jar!/log4j.xml]。 java.io.FileNotFoundException:找不到JAR条目log4j.dtd at com.sun.jnlp.JNLPCachedJarURLConnection.connect(Unknown Source) at com.sun.jnlp.JNLPCachedJarURLConnection.getInputStream(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDTDEntity(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.setInputSource(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl $ DTDDriver.dispatch(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl $ DTDDriver.next(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl $ PrologDriver.next(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) 在com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(未知来源) at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source) at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source) 在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) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at ro.codemart.installer.packer.ant.impl.nestedjar.Main.executeApplicationMainClass(Main.java:216) 在ro.codemart.installer.packer.ant.impl.nestedjar.Main.main(Main.java:290) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at com.sun.javaws.Launcher.executeApplication(Unknown Source) at com.sun.javaws.Launcher.executeMainClass(Unknown Source) at com.sun.javaws.Launcher.doLaunchApp(Unknown Source) 在com.sun.javaws.Launcher.run(未知来源) 在java.lang.Thread.run(未知来源) log4j:WARN没有找到记录器(WizardRunner)的appender。 log4j:WARN请正确初始化log4j系统。
谢谢!
答案 0 :(得分:1)
我认为问题是缺少log4j.jar - 它没有被.jnlp文件指定或加载。您在上一个答案中提到它在您的类路径中,但是如果您通过WebStart运行怎么办?我相信你的类路径仅限于.jnlp文件中定义的内容。
尝试添加
<jar href="log4j.jar" main="true" download="eager" />
到
<resources>
答案 1 :(得分:0)
如果查看堆栈跟踪,则错误的原因是log4j.dtd的FileNotFoundException。看看如何从log4j.xml引用DTD。 DTD是否包含在您的jar文件中?它需要位于JVM可以加载它的位置。
答案 2 :(得分:0)
是的, log4j.dtd 文件嵌入了 log4j-1.2.12.jar 。此log4j jar也在类路径中。