2013-01-03 47 views
0

我创建了一个可运行的jar使用ant但它没有运行。当我运行的jar我得到以下错误蚂蚁可运行jar不工作

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: com/teamdev/jxbrowser/events/NavigationListener 
    at com.MainClass$2.run(Unknown Source) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721) 
    at java.awt.EventQueue.access$200(EventQueue.java:103) 
    at java.awt.EventQueue$3.run(EventQueue.java:682) 
    at java.awt.EventQueue$3.run(EventQueue.java:680) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:691) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 
Caused by: java.lang.ClassNotFoundException: com.teamdev.jxbrowser.events.NavigationListener 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
    ... 15 more 

但是当我使用eclipse创建jar的jar工作正常。 Menifest罐子我与蚂蚁创建的是如下

Manifest-Version: 1.0 
Ant-Version: Apache Ant 1.8.2 
Created-By: 1.6.0_37-b06-434-11M3909 (Apple Inc.) 
Main-Class: com.MainClass 
Class-Path: ./ commons-cli.jar commons-codec-1.2.jar commons-httpclien 
t-3.0.1.jar commons-logging-1.1.1.jar ffmpeg-java.jar fmj.jar jdom.ja 
r logback-classic.jar logback-core.jar lti-civil-no_s_w_t.jar mail.ja 
r mp3spi1.9.4.jar slf4j-api.jar tritonus_share.jar vorbisspi1.0.2.jar 
    xuggle-xuggler.jar comfyj-2.9.jar engine-gecko.jar engine-ie.jar eng 
ine-webkit.jar jniwrap-3.8.4 jxbrowser-3.3.jar jxbrowserdemo.jar log4 
j-1.2.15.jar MozillaInterfaces.jar runtime.jar slf4j-api-1.5.8.jar sl 
f4j-log4j12-1.5.8.jar winpack-3.8.3.jar xulrunner-mac.jar 

和menifest罐子我用eclipse创建的是如下

Manifest-Version: 1.0 
Rsrc-Class-Path: ./ jniwrap-3.8.4.jar lti-civil-no_s_w_t.jar commons-h 
ttpclient-3.0.1.jar slf4j-log4j12-1.5.8.jar vorbisspi1.0.2.jar slf4j- 
api.jar ffmpeg-java.jar fmj.jar commons-codec-1.2.jar engine-ie.jar x 
ulrunner-mac.jar commons-logging-1.1.1.jar winpack-3.8.3.jar mp3spi1. 
9.4.jar tritonus_share.jar commons-cli.jar jdom.jar MozillaInterfaces 
.jar comfyj-2.9.jar jxbrowser-3.3.jar runtime.jar logback-classic.jar 
    engine-gecko.jar mail.jar engine-webkit.jar log4j-1.2.15.jar jxbrows 
erdemo.jar slf4j-api-1.5.8.jar logback-core.jar xuggle-xuggler.jar 
Class-Path: . 
Rsrc-Main-Class: com.MainClass 
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader 

都是相同的,所有的依赖也是创建罐子,但仍然里面用蚂蚁创建的jar不起作用。
我知道你会推荐我用Eclipse创建jar,但我想混淆我的代码,这就是为什么我使用ant来创建可运行jar。

+0

是你自己的类还是不行:NavigationListener? –

+0

“两者都是一样的”它们是如何相同的?他们完全不同。 – Thilo

+0

@Thilo:我的意思是在两个menifest中的classpath是相同的。 –

回答

1

我猜你用Ant生成的jar文件没有jar-in-jar-loader,这就是为什么它无法在嵌入式jar中找到类。

当您使用Eclipse生成JAR时,您可以保存Ant脚本,然后jar-in-jar-loader.zip文件将被添加到项目中。然后使用生成的Ant文件来创建您的JAR。这种方法适用于我。

Ant脚本应该是这样的:

<jar destfile="C:\Users\\workspace\Your.jar"> 
     <manifest> 
      <attribute name="Main-Class" value="org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader"/> 
      <attribute name="Rsrc-Main-Class" value="org.mypackage.MainClass"/> 
      <attribute name="Class-Path" value="."/> 
      <attribute name="Rsrc-Class-Path" value="./ libA.jar "/> 
     </manifest> 
     <zipfileset src="jar-in-jar-loader.zip"/> 
     <fileset dir="${ProjectPath}/bin"/> 
     <zipfileset dir="${ProjectPath}\lib" includes="libA.jar"/> 
    </jar> 

首先zipfileset将包括jar-in-jar-loader.zip

fileset会增加你所有的类

zipfileset会增加libA.jar嵌入式罐子同样应该提到Rsrc-Class-Path

+0

+1这就是我所做的。您只需记住在添加或删除jar文件时重新生成或更新该Ant文件。 – Thilo

+0

是否可以在这里传递像-d32这样的VM参数。 –

+0

@Sandy,建造罐子的时候? –

1

使用Ant生成的Manifest,它在主jar文件之外寻找库jar文件,Eclipse使用特殊的Main-Class和类加载器来获取捆绑的依赖关系。

您可能想要使用OneJar ant task(或类似的东西)来实现与Eclipse相媲美的功能。