“java程序打成jar包 如何处理第三方jar包”
eclipse的export的 runnable jar file 導出的jar包的形式應該可以避免這個問題,直接想所依賴的jar里的class文件也一并打入jar包里了。
問題一:
現在有一j2se程序,依賴于jdk1.5、poi.jar、commons-lang.jar。?
打成jar包后,依賴于jdk的部分代碼是可以執行的。但是依賴于poi.jar、commons-lang.jar這兩個包的程序沒有辦法執行。?
我知道是因為在classPath中無法找到上述兩個包的緣故。但不希望每次都通過設置classpath的方式去運行這個jar程序。?
請問通過什么樣的打包辦法可以讓程序不用設置classpath而找到其所依賴的第三方jar包。謝謝javaeyer能予以指導!?
------------------------------------------------------------------------------------------------------------------?
問題補充:?
昨天嘗試了一個方法。但是這個方法不是我希望的。?
就是把poi.jar、commons-lang.jar整合到我的j2se的jar包中。這樣j2se就能很方便的找到其所依賴的class文件了。?
但是如果一個程序依賴10個,20個甚至更多的jar包的話。這樣做顯然不行。請問還有什么別的方法嗎??
得到了xiaolongfeixiang的友好知道:?
將第三方的jar包,加入到最后的jar包中。?
然后 修改 jar/META-INF/Mainfest 文件?
添加: Class-Path : 依賴jar包的路徑(相對于根路徑的路徑)?
因為手誤而在沒有詳細描述解決過程的時候變采納為了最佳方案,如對您的問題的解決帶來誤導請諒解。現描述可行步驟如下:?
1.通過 http://baike.baidu.com/view/1857179.htm?fr=ala0_1 了解到了mainfest.mf在jar包中的用途。?
2.沒有將第三方jar包放到最后的jar包中(嘗試這么做了,但是不行,所以推斷mainfest.mf中的Class-Path是不會去搜索自己jar包內部的東西的)。這樣我讓應用本身的jar和第三方jar同處一個目錄下。?
3.設定mainfest.mf:?
Manifest-Version: 1.0?
Class-Path: commons-lang.jar poi-2.5.1-final-20040804.jar?
Sealed: true?
Main-Class: ***.***?
問題二:
分別通過buildpath和lib倒入JAR包有什么不同????
===========================
我們可以通過java虛擬機的類加載器來理解。?
通過buildpath設置(或添加)程序使用jar包的classpath。?
Java虛擬機是根據Java ClassLoader(類加載器)決定如何,到那里去加載Class?
=================================================?
我們之所以把jar包放在classPath下,是因為存在ClassPath ClassLoader?
我們之所以可以不再ClassPath指定一些Jar包,但在Java程序中也能使用。?
那是因為有 Root ClassLoader(由C++編寫)?
我們之所以把Jar包放入webroot下的lib文件夾,并且可以在我們的程序中使用,那是容器實現了自己的ClassLoader。?
=============================?
所以說能不能加載Jar,加載哪里的Jar,是根據ClassLoader決定的。?
系統默認提供了3個ClassLoader?
Root ClassLoader -> ClassPathLoader -> ExtClassLoader(用于加載Java虛擬機ext目錄下的Jar)?
當然我們也可以編寫自己的ClassLoader,去加載特定環境下的Jar文件。?
=================================?
你可以去看看ClassLoader的相關介紹(想深入了解java虛擬機的話)。?
================================?
Eclipse只是一個開發工具,至于采用導入方式Copy Jar包,還是采用,手動Copy到webroot\lib目錄下,都是一樣的。?
因為如果你做的是WEB開發的話,不管你是采用Eclipse導入方式還是采用手動拷貝的方式,最后那些Jar都會被放在webroot/lib目錄下。?
當然利用Eclipse去導入Jar包也有一些要注意的地方,比如Eclipse下方會有英文的提示信息"是否將Jar包拷貝到WebRoot/Lib"下,如果沒有選中,?
你會驚訝的發現我的程序也能運行。。。?
這是因為Eclipse在這種情況下,自動將這個Jar包設置成ClassPath形式了。?
如果換一臺機器,你的程序就不能運行了。原因很簡單,?
因為不是所以機器都有ClassPath的。也更不會像Eclipse那樣,自動的為為程序在啟動前設置Jar的ClassPath。?
轉載于:https://www.cnblogs.com/biGpython/archive/2011/11/09/2242396.html
總結
以上是生活随笔為你收集整理的“java程序打成jar包 如何处理第三方jar包”的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 反射矩阵计算
- 下一篇: 悲催的CamShift