2010年6月15日 星期二

匯入外部 *.jar

我在使用 Eclipse 或是 IBM 的 Rational Software Architect 開發,要匯入 Framework 或是 DataBase 的 Driver 等外部 *.jar 檔時,習慣的設定方式是:

1. 將所有的 *.jar 分類好,新增設定 User Libraries
→ Windows → Preference → Java → Build Path → User Libraries
※ 不要勾選 System library ( added to the boot class path )

2. 在 Project 的 Build Path 的 Libraries 引入 User Libraries
3. 進入 Order and Export 勾選引入的 User Libraries
→ Project → Build Path → Cinfigure Build Path → Libraries & Order and Export

4. 接著到 Java EE Module Dependencies 的 Web Libraries 勾選引入的 User Libraries
→ Java EE Module Dependencies → Web Libraries

從我開始寫程式以來都沒有發生過問題!

隨著學習與工作時間的累加,設定的 User Libraries 也慢慢增加,針對不同的專案狀況來使用,最常用的就屬 Struts 、 Hibernate 、 以及針對不同 DataBase 的 JDBC Driver !

前陣子剛建立好一個 Project 時,旁邊的學長跟我說:寫個 main 方法來看看有沒有設定錯誤!就簡單寫了一個有 main 的 Class ,但是在執行過程中不斷甩出 java.lang.ExceptionInInitializerError ,連主管來看都說程式沒錯,不給跑就是不給跑,我就先在 *.jsp 試著把 Table List 出來,竟然成功了耶!

一開始以為是 Hibernate 的 *.xml 或是 DataSource 的設定有誤,就在用 *.jsp 把 Table List 出來之際便明白設定是對的,也代表不會是這兩個問題,但是 *.jar 的配置在以前也沒有出過問題!隨著案子時程的推進,讓我暫時將這問題擱著 ......

直到昨天靈光一閃,把 Build Path 全部移除,再把所有的 *.jar 丟進 WEB-INF / lib 裡,這支含 main 的 Class 就確實執行成功了!才發現到:我很無聊地勾選了 System library(added to the boot class path) 才會這樣,在向主管請教與 Google 之後,將設定方式整理了一些出來:

=================================================

1. 設定 User Libraries 到 Build Path :

用於當 Java 在 Compile 時,可以正確「參考到」這些外部的 *.jar !

※ 有沒有勾選 System library ( added to the boot class path ) 對於用 RSA 開發的人是有些微影響的!

● 優點:
◎ 分類方便醒目
◎ 可多個專案共用,單純的 Java 程式適用

● 缺點:
◎ 需固定 *.jar 的位置
◎ 如果沒有勾選 Order and Export 在 Export Project 時不會一起匯出
◎ 版本控管不易

=================================================

2. 直接將所有的 *.jar 放到 Dymanic Web Project 底下的 WEB-INF / lib 資料夾中:

這是最快的方法,不管是直接 Compile 或是 Web Project 在 Runtime 時都可以正式引用!在 Export Project 的同時也會一同置入 *war 或是 *.ear 中!

● 優點:
◎ Export Project 時會將這些 *.jar 一起匯出
◎ 方便版本控管

● 缺點:
◎ 所有的 *.jar 都在同一個資料夾中,不易整理
◎ Export 出來的 Project 會隨著 *.jar 數量而變大

=================================================

3. 設定好 User Libraries 到 Build Path 並在 Java EE Module Dependencies 勾選匯入的 *.jar :

與第 1 點相同,不同的地方是啟動 Server 的同時會將這些 *.jar 置入 Project 的 WEB-INF / lib 裡, ClassPath 路徑也同時改變!

● 優點:
◎ 分類方便醒目
◎ 可多個專案共用

● 缺點:
◎ 一定要啟動 Server 才能正確執行

=================================================

4. 在 Java EE Module Dependencies 的 Web Libraries 加入其它 Project :

這是用在當我將一個 Project 依照某些規格拆開來開發時使用的方式!

假設將一個 Project 拆成 A 與 B 兩個 Project ,在 B Project 中加入 A Project ,當我啟動 Server 時, A Project 會自動包成 A.jar 放到 B Project 的 WEB-INF / lib 裡面來執行。

一般的 ClassPath 為:~ / oo.jar ; xx.jar ; ...

如果 oo.jar 與 xx.jar 只是一般的 Class ,就很單純,只是引入且可以正確執行!

但是如果 oo.jar 與 xx.jar 是 Web Project ,就表示在 oo.jar 與 xx.jar 裡面也有內部自己在用的其它 *.jar ,一樣有 Project 本身的 ClassPath ,開發的時候是分開的,啟動 Server 的 Runtime 時期便一起置入 WEB-INF / lib 並改變 ClassPath !

● 優點:
◎ 當 Project 很大時將 Project 依功能或屬性切開,方便控管
◎ 如果只是要修改其中一個小 *.jar 時,不需要將 Server 整個 Shutdown

● 缺點:
◎ 新手不易上手。(這是我想得到唯一的缺點 ...)

=================================================

如果是用 Eclipse ,我會一起設定 Struts 的 User Libraries ,執行時會一起 Load 進來沒有問題,可是 RSA 已經先有 Struts 的 Framework ,勾選了 System library ( added to the boot class path ) 就變成 Hibernate 比 Struts 先 Load 進來,才會造成我一開始的錯誤!

這樣的狀況對於在 Eclipse 開發的人是沒問題的,用 RSA 在建立 Dynamic Web Project 時如果有先勾選 Struts 的人可以多加留意!

第 4 種方法,是我進入公司時第一次見到的方式,也是我的主管正式採用的管理開發方式,因為公司案子出去的 Web Project 都有 100Mb 以上,沒有用這方式的話,不管做多小的修改,都需要將 Server Shutdown 再重新 Publish ,需時平均在一小時上下,越大越久!

第一次接觸這樣的方式對我來說真的很新奇,經過案子的實際運作,我個人也非常推薦這樣的管理與部署方式,是說當時也花了不少時間來研究和適應就是了!

以上是經過近兩週的試驗請教與 Google 的結果,分享給有需要的人!

(不過我個人是認為:應該沒有人不懂 ... 吧! Orz )


4 則留言:

sotom 提到...

看不懂...0.0

【七佛滅罪降魔陣】 提到...

那 ... 您要不要跟我說是哪邊不懂?我解釋給您聽!

程式心得筆記 工程屍的日子 | Mr. 一顆痣 a.k.a. bigd 提到...

加上圖文解說會更完美。

【七佛滅罪降魔陣】 提到...

這篇只是概念,有機會我會再寫一篇完整的,不過要等我有時間 ... >"<