簡體   English   中英

運行包含jar jar的jar時,Java NoClassDefFoundError

[英]Java NoClassDefFoundError when running jar containing library jar

幾個小時之后,即使在閱讀了大量的文檔和SO問題之后,我仍然處於機智的盡頭。 我確信我錯過了一些明顯的東西,但我無法理解。

我創建了許多java文件,包括帶有main方法的單個入口點。 該類還在jar文件mylib.jar中使用位於com.test.lib.MyLibraryClass.class中的一個“庫”類。 我正在使用以下ant XML成功構建我的 jar文件。

<target name="jar" depends="compile">
        <jar destfile="${jar.dir}/${jar.name}.jar">
            <fileset dir="${classes.dir}" />
            <fileset dir="${lib.dir}" />
            <manifest>
                <attribute name="Main-Class" value="${main-class}" />
                <attribute name="Class-Path" value="mylib.jar"/>
            </manifest>
        </jar>
    </target>

當我檢查通過執行該目標而創建的jar時,我發現它確實包含了我的所有.class文件以及mylib.jar。

當我嘗試運行jar時,我收到以下錯誤:

Exception in thread "main" java.lang.NoClassDefFoundError: com/test/lib/MyLibraryClass
    at com.mytest.MyMain.<init>(Unknown Source)
    at com.mytest.MyMain.main(Unknown Source)
Caused by: java.lang.ClassNotFoundException: com.test.lib.MyLibraryClass
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    ... 2 more

我需要改變什么? 我是否會生成格式錯誤或不完整的清單?

非常感謝!

問題是標准類加載器找不到位於另一個JAR中的JAR中的類。 Class-Path清單變量實際上是告訴JVM將當前目錄中的mylib.jar文件添加到類路徑中。

有三種解決方案:

  • mylib.jar文件放在可以找到的位置(並相應地設置清單屬性)。

  • 創建一個Uber-jar,它將主JAR中的類和所有相關的庫JAR組合成一個JAR文件。

  • 編寫一個時髦的類加載器,它知道如何從JAR-in-a-JAR加載,並修改應用程序以實例化並使用類加載器。 (不推薦這種方法......)

請注意,前兩個替代方案通過以不同方式擺脫JAR-in-a-JAR結構來解決問題。

如果您嘗試使用java命令運行它,則不支持在jar中嵌入jar。 使用清單中的該條目,類加載器將在您啟動類的基礎文件夾中查找jar,而不是在Jar中。 您可以將mylib.jar放在基礎文件夾中,並使用-cp mylib.jar`選項運行java ,或使用支持運行嵌入式jar的jar的任何工具。 看看這個或者只是谷歌里面的罐子里的罐子,你會得到大量的點擊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM