Java 为什么我的Jnlp程序不能与log4j一起工作?
我有以下问题: 我在Tomcat中部署了一个JNLP和一个可执行JAR文件。JNLP文件应该自动下载JAR文件并执行它。JAR文件经过签名和验证。 这已经完成(下载部分)。 但是当执行JAR主类(在JNLP文件中指定)时,会出现一个问题: 执行主类代码的一部分。之后,当它试图加载一个声明了静态最终org.apache.log4j.Logger实例的类时,它会说一个错误 下面是JNLP文件的代表部分、代码和错误 JNLPJava 为什么我的Jnlp程序不能与log4j一起工作?,java,log4j,jnlp,Java,Log4j,Jnlp,我有以下问题: 我在Tomcat中部署了一个JNLP和一个可执行JAR文件。JNLP文件应该自动下载JAR文件并执行它。JAR文件经过签名和验证。 这已经完成(下载部分)。 但是当执行JAR主类(在JNLP文件中指定)时,会出现一个问题: 执行主类代码的一部分。之后,当它试图加载一个声明了静态最终org.apache.log4j.Logger实例的类时,它会说一个错误 下面是JNLP文件的代表部分、代码和错误 JNLP <?xml version='1.0' encoding='UTF-8
<?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 WizardRunner{
private final static Logger log = Logger.getLogger(WizardRunner.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});
...
}
}
log4j:找不到[log4j.dtd]时出错。已使用[sun.misc.Launcher]$AppClassLoader@d9f9c3]搜索中的类加载器。
log4j:错误无法分析url[jar:。
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.startenty(未知来源)
位于com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startdentity(未知源)
位于com.sun.org.apache.xerces.internal.impl.xmldtddscannerimpl.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.ScandDocument(未知来源)
位于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.domconfigure(DOMConfigurator.java:711)
位于org.apache.log4j.xml.domconfigure(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:警告:找不到记录器(WizardRunner)的追加器。
log4j:警告请正确初始化log4j系统
谢谢!如果查看堆栈跟踪,则错误的原因是log4j.dtd的FileNotFoundException。请查看如何从log4j.xml引用dtd。dtd是否包含在jar文件中?它需要位于JVM可以加载它的位置。是的,log4j.dtd文件嵌入了log4j-1.2.12.jar。这个log4j jar也在类路径中。我认为问题在于缺少log4j.jar-它不是由.jnlp文件指定或加载的。您在前面的回答中提到它在类路径中,但是如果您是通过WebStart运行的,该怎么办?我相信您的类路径仅限于.jnlp文件中定义的内容 尝试添加
<jar href="log4j.jar" main="true" download="eager" />
到
因此您需要调查为什么无法加载它。log4j.jar是否在DemoInstaller.jar中,因为它没有列在JNLP文件中。log4j.jar文件在运行时动态添加到类路径中,所以不需要列在JNLP文件中。您也尝试将其添加到JNLP中,但出现了相同的错误。不完全正确。我同意log4j.jar没有在JNLP中定义文件,但这个jar是在运行时添加到类路径的。如果不是这样,我会得到一个ClassNotFoundException或类似的东西。谢谢你的建议,我已经尝试过了,但仍然有相同的错误消息!所以,这就是问题所在。将我所有的jar添加到标记下的JNLP文件中,像这样,但没有主属性
<resources>