2015年10月19日 星期一

Jetty 的 ClassLoader 與模組設定

這篇記錄的標題有點難定...目的是想用來記錄這幾天遇到的 ClassNotFound 問題。

我的環境原先是在 {$JETTY_HOME}/lib 裡面建立一個資料夾 {$JETTY_HOME}/lib/{PROJECT_NAME},放我的專案要用的函式庫(都是開源的函式庫)
運作時看起來都蠻好的,但後來遇到需要引用另一個我們自己寫的 jar
這時問題就出現了,我把 jar 一樣丟進 {$JETTY_HOME}/lib 資料夾裡,卻一直跑出 ClassNotFoundException 的錯誤。

查了好一段時間,後來突然注意到官方文件 [2] 中有講到 Jetty 9.1 開始引入了模組的觀念
模組的設定會放在 {$JETTY_HOME}/modules,然後啟動時要設定啟用的模組是什麼。
這時首先我的啟動方法是透過 {$JETTY_HOME}/bin/jetty.sh 來啟動的,因此看了一下這個 shell script 裡面寫了什麼
發現它會去讀 $JETTY_HOME/start.ini 這個設定檔,而這個設定檔會讀一系列的模組,其中第一個是 ext 這個模組。
然後 ext 模組是去載入 {$JETTY_HOME}/lib/ext 裡的檔案(預設裡面是沒有東西的)。
於是...我把原本放在 {$JETTY_HOME}/lib/{PROJECT_NAME} 的所有檔案,全部改放到 {$JETTY_HOME}/lib/ext 就好了~囧

就結果來說,其實我還是沒有搞懂原因,因為放在 {$JETTY_HOME}/lib/{PROJECT_NAME} 的第三方函式庫好像都有被 ClassLoader 讀取的感覺
不過總歸來說,按照標準的方法放置東西總是不會錯的~。

參考資料:
  1. How do I place jars in jetty/lib on the jetty classpath?
  2. Managing Startup Modules

沒有留言: