[英]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.