2013-01-03 85 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相媲美的功能。