Liferay研究(一):初步在新Tomcat下部署

Liferay研究(一):初步在新Tomcat下部署
 
從現在開始,會把我最近在研究的開源Portal Liferay一些心得貼出來。研究Liferay版本:Liferay Professional 4.0.0
 
柯自聰兄弟寫過一系列的Liferay Portal開發文章,參考http://www.blogjava.net/eamoi/。所以基礎性內容,本文不再細說,可參考柯自聰的文章或Blog。
 
(一)部署Liferay Portlet
       Liferay簡單部署一個portlet並不是很複雜,通過WEB-INF目錄下的portlet.xml、liferay-portlet.xml、liferay-display.xml描述即可。
 
  描述
portlet.xml portlet.xml用來定義Portlet的諸如部署名稱、初始化參數、支持模式、resource bundle等普通的初始化信息,包括:portlet-name、display-name、portlet-class、init-param、expiration-cathe、supports、portlet-info、security-role-ref等等。其正式的規範請參考:http://java.sun.com/xml/ns/Portlet/Portlet-app_1_0.xsd
liferay-portlet.xml 定義Portlet默認可用的用戶組、默認模板、是否支持多個實例等,規範由http://www.liferay.com/dtd/liferay-Portlet-app_3_5_0.dtd
liferay-display.xml 定義Portlet默認的所屬類別。Liferay Portal對Portlet實行按類別管理和劃分用戶權限。

 
       Liferay是基於Struts Template頁面模版技術來實現頁面的,所以Liferay默認提供了com.liferay.portlet.StrutsPortlet這個Portlet Class來完成Portlet處理的;當然爲了簡單對普通jsp頁面的處理,Liferay也提供了com.liferay.portlet.JSPPortlet等其他Portlet Class。
 
       Liferay擴展了Portlet Mode,增加了about,config,preview,print等幾種模式。所以,開發人員基於Liferay進行擴展Portlet Class需要基於com.liferay.portlet.LiferayPortlet。當然,允許直接繼承javax.portlet.GenericPortlet進行擴展。
 
(二)部署Liferay應用在新下載的Tomcat上
 
       這一塊耗費我不少時間,因爲Liferay採用了其修改後的Tomcat(實際上是Tomcat5.5,這是我後來才知道的)。
       但我很不喜歡Liferay這種綁定方式,而且默認開發必須採用其層層Ant Build方式,並且綁定其Tomcat或其他其修改後提供的server。——當然,在Liferay可能認爲這樣可以減少開發人員對環境配置的關心。
 
       讓我來看看,如何在一個新下載的Tomcat5.0.28上成功部署Liferay應用:
 
(1)       首先把liferay工程目錄放置Tomcat_Home/目錄下,當然,你可以放置在Tomcat_Home/web-apps目錄下。
(2)       其次,需要把liferay默認的目錄下的Common/lib/ext目錄下的一些jar包copy到Tomcat_Home/common/lib 目錄下。注意,不要放置在ext目錄下,默認tomcat5.0.28是不自動加載ext目錄下的jar包的,這跟Tomcat5.5不同。這些jar包主要是:hsql.jar,commons-logging.jar,log4j.jar這三個。
(3)       把liferay默認的目錄下的Common/lib/ext中的portal-shared.jar 和 portlet.jar ,可以移到liferay應用的WEB-INF/lib中。
(4)       拷貝Root.xml到 Tomcat_Home/conf/Catalina/localhost目錄下,配置webcontext信息。並在此配置DataSource。注意,liferay的默認運行中的配置是Tomcat5.5的寫法,所以此處配置DataSource的寫法,就必須更改爲Tomcat5.0的寫法。否則,運行過程中會拋“Cannot create JDBC driver of class '' for connect URL 'null'”異常。
<Context docBase="D:/Tomcat5028/ liferay" path="" reloadable="true">
<Resource name="jdbc/LiferayPool" auth="Container"
               type="javax.sql.DataSource"    />
<ResourceParams name="jdbc/LiferayPool">
           <parameter>
<name>factory</name>
               <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
XXX(其他配置,此處略)
     </ResourceParams>
</Context>
有關Liferay對連接池的引用,可以去Portal.properties配置文件中修改。默認此配置文件已經被打在了liferay的portal-ejb.jar中。

 
(5)       配置jaasconf。講jaas.config文件放置在Tomcat_Home/conf目錄下。並在catalina.bat文件中增加 -Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.config 來設置jaas的配置。當然,這首先一定要保證在前面的Root.xml的Context中配置JAASRealm。
//注意,暫時必須把liferay應用配置成爲默認根應用,否則不可以正確運行。
<Context docBase="D:/Tomcat5028/ liferay" path="" reloadable="true">
<Realm className="org.apache.catalina.realm.JAASRealm"
          appName="PortalRealm"
           userClassNames="com.liferay.portal.security.jaas.PortalPrincipal"
          roleClassNames="com.liferay.portal.security.jaas.PortalRole"
          debug="99"
          useContextClassLoader="false" />     
</Context>

              在jaas.config的文件中,設置如下內容:
PortalRealm {
     com.liferay.portal.shared.security.jaas.PortalLoginModule required;
};

              Jaas是需要被正確配置的,否則系統不可以正確登陸,而且會一直不斷的訪問/jaas_securit_check,而不能登陸。
 
基本上進行如上操作之後,即可在Tomcat5.0.28下單獨運行。 

 

 

Liferay研究(二):對Liferay進行瘦身
 

       Liferay的體系是很龐雜的,居然有些文章對外宣稱Liferay是微內核,我想寫這文章的哥們沒有搞清楚什麼是“微內核”。
 
       Liferay 受其企業版本影響不小,畢竟Liferay公司主要還是“企業行爲”,而不是一個單純的一個“開源團體”行爲。所以Liferay Portal本身內嵌了大量的Portlet,而且這些Portlet和Liferay Portal Framework甚至還有些交融。這就是爲什麼liferay portal-ejb.jar會有3M多。
 
       雖然我們可以通過修改system.properties,portlet.properties,protal-spring這些基礎配置文件來修改聲明哪些服務不需要加載,也可以通過修改 WEB-INF目錄下的portlet.xml,liferay-portlet.xml以及liferay-display.xml這些文件來刪除一些不需要的portlet。
 
       但是,我想真正敢真麼乾的,估計很少。這是爲什麼呢,就是應爲Liferay內部實現的結構和代碼,並不是非常良好。而對於這一塊的優化,也沒有很詳細的幫助使用手冊。在Liferay的網站上,只有一些教開發人員如何部署在不同服務器和數據庫,如何新增一些portlet和theme,以及如何修改權限方面的淺顯參考手冊。
 
       接下來就講一講對Liferay的瘦身操作,Liferay變成一個只提供最基本的Portal框架和部署機制的portal context,而去掉那些多餘的portlet。—— 因爲這些多餘的portlet大多國內的項目沒有任何利用價值,但是如果需要部署的話,則會大大影響系統響應性能,而且讓開發也變得比較麻煩。
 
       當然,是否按照我今天說的方式對Liferay進行瘦身,這全憑習慣。有些朋友不願改變Liferay的結構,只希望單純通過配置來加載,也是可以的。
 
(1)保留Liferay最基本的一些組件
      
       Liferay提供了一些基本組件,這些組件不屬於Portal框架之內,但是整個portal服務是基於這些組件。

包結構
說明
com.liferay.counter
主要提供主建操作服務,Liferay內部的提供的組織結構表維護,就是採用counter提供的主建自增機制
com.liferay.filters
提供一些基礎的基於servlet filter的過濾器
com.liferay.taglib
提供最基本的web展示標籤
com.liferay.util
提供最基本的一些公共組件
       以上這四個組件是必須保留的,另外還有兩個基本組件:com.liferay.mail(提供郵件服務)和com.liferay.wsrp(提供webservice服務)。這個實際上應該屬於可選的,如果覺得需要的話,也可以納入。
 
(2)保留Liferay的Portal基礎服務
       Liferay的基礎服務是以com.liferay.portal作爲基礎的,基本屬於此包內的都儘量保留。目前其子package說明如下:

包結構
說明
com.liferay.portal
此包下放置了portal服務相關的一些異常
com.liferay.portal.action
負責一些struts action處理,比如Login等
com.liferay.portal.definitions
此包不是類包,而是負責放置一些定義相關的dtd文件資源。具體需要哪些dtd,可以參考com.liferay.portal.util. EntityResolver類
com.liferay.portal.dependencies
此包也不是類包,而是負責一些依賴性的資源文件。
com.liferay.portal.deploy
負責自動部署和熱部署
com.liferay.portal.events
這個包內主要是一些行爲處理類
com.liferay.portal.im
即時消息的支持
com.liferay.portal.jcr
提供JSR-170 JCR的支持,並內部提供Jackrabbit的實現支持
com.liferay.portal.job
對一些時間調度性Job的支持
com.liferay.portal.language
對語言的支持包
com.liferay.portal.lucene
對全文檢索的支持
com.liferay.portal.model
一些模型對象的集合
com.liferay.portal.security
 
com.liferay.portal.servlet
 
com.liferay.portal.spring
 
com.liferay.portal.struts
 
com.liferay.portal.theme
提供對“主題”,也就是界面風格的支持
com.liferay.portal.tools
 
com.liferay.portal.util
 
com.liferay.portal.velocity
 
com.liferay.portal.wsrp
 
 
       其實我們可以把Liferay這些portal服務再縮簡一些,但剛開始建議大家不要隨便的刪減,保留原始的即可。
 
(3)縮減portlet應用
       Liferay提供了大量的portlet應用,有大概七八十個。正應爲這些portlet的加載和部署,讓Liferay啓動緩慢,消耗系統資源多。實際上,保持Liferay Portal正常運行,只需要其中幾個就可以了,剩下的,我們可以根據需要進行刪減。
 
       下面列出了一些最基本的portlet,只需要保留如下的這些portlet即可保證liferay的正常啓動和運行

包結構
說明
com.liferay.portlet
Liferay Portlet的一些基礎類
com.liferay.portlet.admin
管理portlet
com.liferay.portlet.calendar
日期portlet雖然可以不需要,但是其內部提供對job的調度。
com.liferay.portlet.communities
這個是負責配置用戶其所在的group,利用可以配置用戶所擁有的工作區。
com.liferay.portlet.enterpriseadmin
 
com.liferay.portlet.language
 
com.liferay.portlet.layoutconfiguration
 
com.liferay.portlet.login
 
com.liferay.portlet.myaccount
用於配置用戶信息
com.liferay.portlet.myplaces
用於控制用戶的工作區選擇
com.liferay.portlet.portletconfiguration
 
com.liferay.portlet.themegallery
用於控制主題風格
com.liferay.portlet.translator
這個包必須要,雖然portlet可以不用,但是被portal.language包引入了
com.liferay.portlet.wsrp
這個包必須要。
 
       只需要保證如上的portlet在系統中,即可保證Liferay的正常運行。
 
       但是,不以爲只需要簡單得講起他的Porlet刪除即可,那就大錯特錯了。Liferay在這一層面做的非常不友善,內部代碼由一點點地耦合。很多地方依靠寫if else來判斷,所以造成了在portal這個服務包中,竟然存在很多地方引用portlet中的類。
       不過這個倒不難修改,只需要花費一點點時間,簡單修改一下就可以了。比較容易,此處就不多說。
 
(4)從配置文件中刪除無用portlet的部署
      
       這個主要是修改WEB-INF目錄下的portlet.xml,liferay-portlet.xml以及liferay-display.xml這些文件。只需要依次把那些不需要的portlet刪除即可。沒有什麼難度,細心點就可以了。
 
(5)修改服務配置文件
 
       Liferay的配置文件也是很多,放置也是在好幾個地方:

位置
配置文件說明
/WEB-INF
portlet描述和struts等配置文件
/WEB-INF/classes
system.properties和portal.properties配置文件
/WEB-INF/classes/META-INF
portal-spring.xml,portal-hbm.xml,portal-log4j.xml配置文件。此位置可調,具體可以修改portal.properties內容。
 
       爲了讓系統正確運行,我們還需要修改system.properties和portal.properties配置文件,這是Liferay核心配置文件。Liferay的很多服務都是在此配置文件中聲明和修改。具體修改哪些本文不細說,改篇專門作個專題講。
 
       還需要修改portal-spring.xml(如果是professional版,則是portal-spring-professional.xml)。需要將那些已經沒有的類bean刪除。否則Liferay現在的加載機制,一旦碰到沒有的類的bean,則加載不成功了。
       當然portal-hbm.xml也是需要修改的,去掉那些不需要的類即可。
 
       基本上經過以上五個步驟,Liferay即可完成手身了。在真實系統研發過程中,不一定非要選擇這樣的瘦身方式,畢竟這種方式,對後續Liferay版本的維護帶來一定的工作量。—— 但是,如果這麼嘗試一把,則可以在通過調試過程中,對Liferay的配置體系和代碼結構體系有個較爲清晰的認識

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章