0

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は正常に機能しました。アリで作った壺のメニフェストは以下の通りです

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 

そして、私が日食で作成した瓶のメニフェストは以下の通りです

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内にありますが、antを使用して作成されたjarは機能していません。
Eclipseを使用してjarを作成することをお勧めしますが、コードを難読化したいので、antを使用して実行可能なjarを作成しています。

4

2 に答える 2

2

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すべてのクラスを追加します

2番目zipfilesetは埋め込みjarとしてlibA.jarを追加し、同じことがRsrc-Class-Path

于 2013-01-03T06:39:51.190 に答える
1

Antで生成されたマニフェストでは、メインjarファイルの外部にあるライブラリjarファイルを検索します。Eclipseでは、特別なメインクラスとクラスローダーを使用して、バンドルされた依存関係を取得します。

おそらく、OneJar antタスク(または同様のもの)を使用して、Eclipseの機能に匹敵するものを実現したいと思うでしょう。

于 2013-01-03T06:36:38.497 に答える