我正在嘗試使用Ant Build來構建一個項目,並且我引用了幾個jar來使其工作。現在,當我把由Ant構建的jar創建到其他機器並運行它時。 我收到錯誤NoClassDefFoundError org/apache... Not found
。 反正有沒有把所有引用的jar放在項目的classpath或manifest文件中?
或者有無論如何重新包裝項目中的所有罐子? 我知道有一種方法使用jarjar但我不知道如何使用它。
請給我一些建議,我一直堅持這個小問題很長一段時間。Jar:找不到類Def錯誤
0
A
回答
0
使用ANT構建時,您需要的外部罐子正被ANT工具添加到類路徑中。查看構建腳本,最有可能在javac任務中或在定義類路徑的設置任務中有條目。
生成代碼後,您的jar文件只包含您的類,第三方jar文件(如Apache)中的類默認不添加到您的jar文件中。
你需要決定的是你想要一個包含所有需要的類的單個jar文件還是願意部署多個jar文件?如果您願意將應用程序作爲多個jar文件提供,那麼您將需要提供批處理文件或shell腳本來爲構建類路徑的用戶啓動應用程序,以包含已部署的jar。
如果你想要一個jar文件,你可以做下面的事情。假設你有第三方jar文件是由ANT財產確定lib.dir目錄:
<jar destfile='${build.dir}/lib-jars.jar'>
<zipgroupfileset dir="${lib.dir}">
<include name="**/*.jar" />
</zipgroupfileset>
</jar>
<sleep seconds='1'/> <!-- avoid timestamp warnings -->
這是什麼會做你的build.dir是創建目錄中名爲一個jar文件lib-jars.jar包含所有第三方jar中的所有類。理解這將導致相同的文件(如MANIFEST.MF文件)被覆蓋,如果它們存在於多個罐子中並且只有最後一個存在。
一旦你有了這個新的全庫罐子,然後你可以罐子你的應用程序類和這個全庫罐子的內容放入一個罐子:
<jar destfile='${jar.file}' basedir='${classes.dir}'>
<!-- using zipfileset we can filter on entries in the one file -->
<zipfileset src='${build.dir}/lib-jars.jar'>
<exclude name="META-INF/MANIFEST.MF"/>
</zipfileset>
<manifest>
<attribute name="Built-By" value="${user.name}"/>
<attribute name="Main-Class" value="${main.class}"/>
<section name="common">
<attribute name="Specification-Title" value="${project.title}"/>
<attribute name="Specification-Version" value="${release.version}"/>
<attribute name="Specification-Vendor" value="${vendor}"/>
<attribute name="Implementation-Title" value="${project.title}"/>
<attribute name="Implementation-Version" value="${release.version}"/>
<attribute name="Implementation-Vendor" value="${vendor}"/>
</section>
</manifest>
</jar>
通知我排除MANIFEST.MF來自全部庫的文件並創建自己的文件。然後,最終的結果是一個單獨的jar文件,其中包含所有庫jar文件和類的所有類/屬性文件/資源。
相關問題
- 1. Spring Boot類def找不到錯誤
- 2. .jar文件得到錯誤找不到主類
- 3. Java沒有類Def錯誤
- 4. 沒有類Def錯誤ElementListener
- 5. Android SlickAE(libgdx)沒有類def找到錯誤
- 6. JAR:找不到主類
- 7. 批處理文件執行的jar錯誤 - 找不到主類
- 8. PHP錯誤,找不到類
- 9. Rails:找不到錯誤類
- 10. 錯誤:類org.opencv.core.Mat找不到
- 11. 錯誤「找不到主類」
- 12. 「找不到主類」錯誤
- 13. 找不到類錯誤
- 14. 找不到GoogleApiClient類錯誤
- 15. Slim3錯誤。找不到類
- 16. 找不到類錯誤膨脹類android.support.design.widget.BottomNavigationView
- 17. 找不到猜錯遊戲類錯誤
- 18. 沒有類Def的發現錯誤
- 19. 添加admob jar文件和類未找到錯誤
- 20. .jar錯誤 - 無法找到或加載主類
- 21. Ubuntu Apache Storm jar錯誤:無法找到或加載主類storm.starter
- 22. 錯誤:「無法找到或加載主類\ lib \ jamm-0.3.0.jar」
- 23. Java -jar錯誤:無法找到或加載主類
- 24. 修復錯誤:無法找到與jar的主類
- 25. 錯誤:無法找到或加載主類?jar
- 26. jar導出後找不到的類
- 27. 在jar中找不到我的主類
- 28. 上的.jar執行「找不到主類」
- 29. Jar to Exe - 找不到主類
- 30. 在omnifaces-2.2.jar下找不到PushContext類
你是如何運行它? – Mark
也許這將有助於: http://stackoverflow.com/questions/1821803/creating-a-bundle-jar-with-ant – NeplatnyUdaj
目標機器上的外部容器(包含org/apache等) ? classpath或java.ext.dirs是否設置爲指向目標機器上的外部罐子? – karakuricoder