星期五, 5月 03, 2013

Shopizer 1.1.5 移植JBoss-AS-7.1.1


因為工作需求,要將Shopizer移植到JBoss-AS-7上。
Shopizer是一套開源的電子商務(EC,Electronic Commerce)系統。
官方網站是www.shopizer.com,這個網站的首頁寫到可以支援Oracle、MySQL、HyperSQL這三種Database,以及多種Web Container,像是
Tomcat、Jetty、Oracle Weblogic、Web Sphere、JBoss。我們預計是要使用JBoss AS 7與MySQL,第一眼的印象來看,這會是不錯的選擇。
我們先前有測試另一套EC叫做Broadleaf,不過很無奈的是它編出來的檔案好像都透過Jetty執行,而不是包裝成war檔執行。而且它不是完全的開源,不符合我們的需求。

使用web container 版本 jboss as 7
使用jdk 版本1.7
使用opensource ec :shopizer 1.1.5
使用database :MySQL 5
使用IDE Eclipse J2EE JUNO

第一步是閱讀README,然後遵照指示匯入資料到MySQL
依照shopizer的readme把該建立的MySQL user , database建立好之後,用ant執行shopizer-build-mysql.bat
要補衝mysql-connector-java-5.1.24-bin.jar在drivers底下,才不會出錯。
由於shopizer這套系統是法國人寫的,所以在匯入的資料中會有特殊字元,但是已經呈現亂碼。
需要用firefox打開後使用UTF-8顯示正確資料,再把資料存成utf-8格式匯入。

第二步是匯入shopizer 1.1.5專案到eclipse內
總共有core,central,shop,media四個專案。
修正專案上的build path的bug,剔除重複使用的jar檔,切換到開發環境的jdk。
設定core的mysql連線(core-conf/properties/system.properties)。
設定centrl與shop的ant組態檔,使用eclipse內建的ant plugin編譯core,central,shop。
編譯完後core會產生jar檔,central與shop會產生war檔。
佈署到tomcat 7 上運作正常,只是central要先設定過後shop才能夠使用,所以移植時應以central為主。

第三步,開始移植到jboss as 7 上
使用預設的程式碼編好的war檔直接佈署到jboss上,在佈署時候就會產生出許多error,jboss卻仍然表示佈署成功。
Central的登入頁面可以顯示,但是無法登入,這時console會跑出更多的error,多半是以mysql連線相關。
其實大多數的問題不在MySQL,這個錯誤訊息會誤導我們解決問題的方式。
在眾多的錯誤中,我們發現在佈署針對vfs 檔案讀取上JBoss跟Tomcat來比有不同的做法,於是我們更新了struts底下的xworks,也順道更新了struts的版本至2.3.12。
解決了vfs 的問題後,在struts上的問題已經解決,剩下的則是Spring的問題,jboss在Spring Framework版本上有特別的限制,由於官方網站並沒有寫Spring的版本是哪個版本,我們在Spring的設定檔中發現是使用2.5的版本,但是只有一個spring.jar檔。
推測是開發這套的人已經先整理過程一個jar檔。
我們先是下載最新的3.2版Spring,但是3.2版已經跟使用Spring 2.5版的程式碼不相容。所以在Spring的版本上我們改用3.0.0先測試,並確認原本的程式碼不會因為更新了jar檔無法使用。
經過不同的Spring版本測試後,我們發現在3.0.6版的spring在佈署之後是不會跑出關於Spring的錯誤。
剩下就是captcha使用的class問題。
由於JBoss 在rt.jar中沒有用到jpeg的library的設定,在JBOSS_HOME\modules\sun\jdk\main\module.xml需要加上<path name="com/sun/image/codec/jpeg"/>
這樣子JBoss在執行過程當中才不會有jpeg class的問題。

完成central佈署並建立store基本資料。
我們把shop佈署到jboss上,卻發現shop使用的一個taglib的definition檔無法存取,但是檔案位置是正確的。
解決tablib的問題

看起來,新的Web Container在處理jsp檔案時有針對taglib的tld 特別定義過

查詢JBoss的線上文件
JSP.7.3.1         Identifying Tag Library Descriptors

Tag library descriptor files have names that use the extension .tld, and the extension indicates a tag library descriptor file. When deployed inside a JAR file,
the tag library descriptor files must be in the META-INF directory, or a subdirectory of it.
When deployed directly into a web application, the tag library descriptor files must always be in the WEB-INF directory,
or some subdirectory of it. TLD files should not be placed in /WEB-INF/classes or /WEB-INF/lib, and must not be placed inside /WEB-INF/tags or a subdirectory of it,
unless named implicit.tld and intended to configure an implicit tag library with its JSP version and tlib-version.

上面的文件說明不可以將tld檔案放到/WEB-INF/classes與/WEB-INF/lib底下,只要放在/WEB-INF底下就可以了。
把tld檔放到正確的位置,並用eclipse修改所有使用這個tld的jsp檔案後。shop佈署就可以跑了。

但是central上傳的檔案shop讀不到。
central上傳檔案是用絕對路徑存檔,shop讀檔是用web路徑讀檔。
要把media佈署到JBoss上。
JBoss as 7 佈署壓縮檔war時並不會解壓縮,這與原來在tomcat會解壓縮的做法是不一樣的。
必須要把media手動佈署到jboss上,調整圖檔的路徑。
media要能夠在jboss as 7 底下用war目錄部屬,而不是用war檔佈署。
在stackoverflow與jboss admin guide 可以找到答案

<subsystem xmlns="urn:jboss:domain:deployment-scanner:1.1">
      <deployment-scanner path="deployments" relative-to="jboss.server.base.dir" scan-interval="5000" auto-deploy-exploded="true"/>
 </subsystem>
並使用手動佈署,反正media沒有程式只有路徑,也不需要重複佈署,接壓縮後佈署一次就夠了。

另外在產品圖片上傳會有class not found sun.awt.image.BufferedImageGraphicsConfig 的錯誤訊息,只要把runtime與compile time的jdk切換成1.6版本的即可,目前1.7版本的jdk有許多跟1.6版本不太一樣的地方,建議還是用1.6版本比較適當。

沒有留言: