討論區快速選單
知識庫快速選單
政府補助!學嵌入式+物聯網 網路投保旅行平安險 想要資料分析就學Python
[ 回上頁 ] [ 討論區發言規則 ]
關於製作jar file的問題
更改我的閱讀文章字型大小
作者 : gotti(gotti)
[ 貼文 50 | 人氣 2001 | 評價 340 | 評價/貼文 6.8 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/3/30 下午 12:29:00

我在Eclipse的環境中開發一個gui application,在Eclipse的環境中執行都沒問題,把我的ap利用Eclipse的export功能製作成jar file後(沒有錯誤),執行時卻出現NoClasDefFoundError的問題,問題的來源是一個負責處理connection pool的class(網路下載取得),它也是一個jar file。

我試過在CLASSPATH加上該檔路徑,但還是行不通。

值得注意的是,我有特別指定C:\j2sdk1.4.2_03\jre\bin\javaw.exe作為Eclipse所使用的VM,因此,我必須把所有ap參考的jar file放在C:\j2sdk1.4.2_03\jre\lib\ext目錄下,這個部份在開發過程中也沒出現問題。

請問我是不是有什麼地方沒注意到?或者,在製作jar file時,該如何處理ap中所參考到的其他jar file?Thanks
作者 : gotti(gotti)
[ 貼文 50 | 人氣 2001 | 評價 340 | 評價/貼文 6.8 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/4/27 上午 03:33:15
這問題我已經找到答案,提供各位參考。

下面這個例子只適用於Eclipse開發環境。
要讓你的jar file能夠參考到它所用到的外部的jar file(例如jdbc driver),必須做下列動作:

1.建立一個目錄(例如libs),然後把你的程式所用到的外部jar file(external jar files)放在這個目錄下。接著,refresh你的專案,你應該會看到libs目錄。
2.在Eclipse環境中,我們必須明確地將那些外部jar file加入我們的專案中,這個動作完成之後,你的程式在Eclipse環境中執行時,就可以參考到那些外部jar file。
   從功能表選擇「Project」-->「Properties」,你應該會看到一個視窗被開啟。
3.接著,在左邊的樹狀結構中,選擇「Java Build Path」-->選取「Libraries」-->按「Add JARs..」按鈕,你又會看到Jar Selection視窗出現。
4.選擇libs目錄-->選擇你所需要的外部jar file-->按OK,即可將該jar file加入你的專案。重覆這個動作,直到所有libs目錄下的jar file全部都加入到你的專案中。如果沒問題,你應該可以看到那些Jar file出現在步驟3 的視窗中。
5.在步驟3的視窗中,選取「Order and Export」這個tab,然後將你在上個步驟中加入的jar file一一勾選。最後按OK,結束這個視窗。你現在應該可以看到那些jar file出現在你的專案中。
6.接下來,你要把那些外部jar file匯入你的專案中。從功能表選擇「File」-->再選「Import...」-->選「Zip file」-->按Next。
7.現在你應該會看到一個視窗,內含兩個Browse按鈕。先點選上面那個「Browse」按鈕,然後選擇libs目錄下的某一個jar file做為匯入jar file的來源;另外,再點選下面那個「Browse」按鈕,選擇你的專案所在目錄做為匯入jar file的目的。最後按「Finish」按鈕,完成匯入一個jar file的動作。你現在應該可以看到你的專案中多了一個目錄(視你匯入的jar file而定),表示匯入成功。重覆這個步驟直到所有jar file都加入到你的專案中。

簡單說明一下,這些步驟看似複雜,其實只做兩件事。第一,讓Eclipse知道要到哪裡去找你的程式所用到的external jar file;第二,把external jar file匯入到你的專案中,如此一來,你的程式包成jar file之後,無論它在哪裡,它都知道要到哪裡去找那些external jar file(因為它們已經成為你程式的一部份)。

最後,你只要將你的程式利用File-->Export...的功能匯出成jar file,它應該能夠參考到你所需要的外部jar file。

另外附上我在網路上找到唯一一個跟這個問題有關的討論,如果我的方法你不適用,或許你可以在這裡找到答案。
http://forum.java.sun.com/thread.jsp?thread=405160&forum=22&message=1772703
作者 : duncan_macleod(洋將) Java卓越專家貼文超過1000則
[ 貼文 1121 | 人氣 921 | 評價 2490 | 評價/貼文 2.22 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/4/30 下午 09:25:06

>
>我在Eclipse的環境中開發一個gui application,在Eclipse的環境中執行都沒問題,把我的ap利用Eclipse的export功能製作成jar file後(沒有錯誤),執行時卻出現NoClasDefFoundError的問題,問題的來源是一個負責處理connection pool的class(網路下載取得),它也是一個jar file。
>
>我試過在CLASSPATH加上該檔路徑,但還是行不通。
>
>值得注意的是,我有特別指定C:j2sdk1.4.2_03jreinjavaw.exe作為Eclipse所使用的VM,因此,我必須把所有ap參考的jar file放在C:j2sdk1.4.2_03jrelibext目錄下,這個部份在開發過程中也沒出現問題。
>
>請問我是不是有什麼地方沒注意到?或者,在製作jar file時,該如何處理ap中所參考到的其他jar file?Thanks

如果你的 executable jar 依存某個 library jar 檔案,一種作法是把你使用到外部 jar 中的 classes/resource 包到你的 executable jar 裡,但你可能搞不清楚你的程式到底 depend on 哪些部分。

一種方式是把外部 library jar 裝到 user 使用的 JRE 裡的 ext 目錄,但這會有版本控管上的問題(你沒有辦法把數個不同版本的同一套 library(jar) 放到 ext 裡,然後控制各個程式使用他們所需要的版本)。

我選擇的最法是(也是最懶的):把你的 executable jar 與 library jar 一起發佈出去(各自以 jar 檔案存在),最好就放在同一個目錄下最方便,然後在你的 executable jar manifest 檔案裡(除了 Main-Class entry 外)加上 Class-Path entry 指向 library jar。

比如說你的程式需要用到 JFreeChart 0.9.16 與 JCommon 0.9.1 來繪製圖表,那麼你在 manifest 檔案裡加上:

Class-Path: Class-Path: jcommon-0.9.1.jar jfreechart-0.9.16.jar
(記得 manifest 最後一定要有一空行)

假如這兩個使用到的 jar 你不是要放在和你的 executable jar 同一層目錄,你可以在 Class-Path entry 裡使用相對路徑。

不要把外部 jar 整個原封不動包到你的 jar 裡,這麼做絕對沒有辦法使用 classpath 的設定來讓 JRE 找到你要的 class,你得自製 classloader 或使用自己把 class 一一從 jar 解出來謂給 classloader(程式會變的不好寫),或許使用 java.net.URLClassLoader 也可以,但你得懂得位於 jar 檔裡的檔案的 URL 怎麼寫(你可以透過 Class - getResource method 取得 jar 檔案裡的某個檔案,然後觀察傳回的 url 格式)。
作者 : gotti(gotti)
[ 貼文 50 | 人氣 2001 | 評價 340 | 評價/貼文 6.8 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/5/1 上午 10:08:56

>我選擇的做法是(也是最懶的):把你的 executable jar 與 library jar 一起發佈出去(各自以 jar 檔案存在),最好就放在同一個目錄下最方便,然後在你的 executable jar manifest 檔案裡(除了 Main-Class entry 外)加上 Class-Path entry 指向 library jar。
>
>比如說你的程式需要用到 JFreeChart 0.9.16 與 JCommon 0.9.1 來繪製圖表,那麼你在 manifest 檔案裡加上:
>
>Class-Path: jcommon-0.9.1.jar jfreechart-0.9.16.jar
>(記得 manifest 最後一定要有一空行)
>
>假如這兩個使用到的 jar 你不是要放在和你的 executable jar 同一層目錄,你可以在 Class-Path entry 裡使用相對路徑。

我依照你的方法試過了,沒問題,Thanks very much!
 板主 : 風月
 > Java入門一般區 - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Java入門一般區 - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Java入門一般區
1 洋將 2410 
2 Aron 2130 
3 Aries 1510 
4 DEMO999 1310 
5 Ben 990 
6 ramb 620 
7 ozzy 570 
8 tand 460 
9 Huah 410 
10 vindy 400 
Java入門一般區
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
0.046875