歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java程序打成jar包 如何處理第三方jar包

Java程序打成jar包 如何處理第三方jar包

日期:2017/3/1 10:26:19   编辑:Linux編程

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.了解到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。

Copyright © Linux教程網 All Rights Reserved