基于Tomcat开发Portlet
本节通过配置一个基于Liferay的Tomcat绑定二进制包建立一个扩展开发Liferay的环境,这个环境特别适用于对新的Portlet组件进行调试和开发。这个方法几乎不会修改Liferay自身的代码,所有的改动都是在扩展环境里完成,可以在Liferay升级时比较容易地实现扩展了的功能的迁移。但这个方法也有一个缺点,就是开发的Portlet如果不执行deploy步骤,就不能在Liferay里启用。因此在开发和调试Portlet的过程中,一般还是在Liferay以外的环境中开发调试好,之后移植到此扩展开发环境中,与Liferay联调,成功后部署应用。具体工作中,可以与后面“改进和调试Liferay自身代码”一节中调试Portlet的方法稍作比较,选择适合自己情况的方法。
3.1 配置扩展开发环境
为了方便进行自己的修改和定制开发,同时又能与Liferay的更新保持兼容,我们使用单独的目录来放置自己的修改,这样在Liferay发布新版本时,可以直接升级Liferay部署,而不会与我们的修改相冲突。具体地,我使用了d:\liferay\ext 目录来放置所有的扩展(包括JSP、class文件及依赖库等)。
首先要在d:\liferay\portal 目录下建立一个名为“release.${username}.properties”的配置文件,其中${username}就是当前Windows登陆的用户名,可以通过“开始菜单-》运行-》cmd.exe”后显示的默认路径看到,跟在“Documents and Settings”字样后面的就是当前登陆的用户名。这样,我的配置文件的名称是release.administrator.properties 。文件的内容只写一行:lp.ext.dir={Liferay}\ext其中“{Liferay}”指的是Liferay源代码存放的上级目录,比如我写的这一行就是:
lp.ext.dir=d:\liferay\ext
回到上一节建立好的Eclipse中的Ant视图中,双击展开根节点Portal,应该可以看到很多Ant任务,顺序执行 clean, start,build-ext 。屏幕下方的命令行窗口会跳跃大堆大堆的文字提示信息,如果一切正确,那么其中不应该有红色的错误信息(绝大多数此处可能出现的错误都是配置文件不正确所引起的)。一切正常的话,那么d:\liferay\ext 目录下应该生成了很多东西了。
(转载者注:一种错误有可能是Jikes缺少,其余基本上是路径配置问题)
我们将前面准备好的与Tomcat绑定的Liferay Professional版本的压缩包解压到d:\liferay\ext\servers\tomcat 目录下,并且在d:\liferay\ext 目录下建立一个名为app.server.{username}.properties的文件,在我这也就是app.server.administrator.properties,文件内容写如下两行:
lp.ext.dir={Liferay}\ext
app.server.type=tomcat
在我这也就是:
lp.ext.dir=d:\liferay\ext
app.server.type=tomcat
然后仿照前面在Eclipse里建立新的Java工程的方法,建立一个新的Java项目,指向d:\liferay\ext 目录,也就是说,在输入Java项目的项目名称时,输入“ext”而不是前面输入“portal”。
3.2 添加插件支持
为了能够在基于Tomcat的Liferay Porfessional版本的运行环境上实现我们编写的插件的调试,需要给Eclipse环境添加一个借助
Tomcat服务器开展调试的插件,也就是Sysdeo这个插件,可以到 http://www.sysdeo.com/eclipse/tomcatplugin 下载,我下载的是tomcatPluginV31.zip文件(将下载的这个zip文件包解压,拷贝到Eclipse安装目录的plugins目录下,比如我这里就是拷贝到了C:\j2sdk1.4.1_07\eclipse\plugins\ 目录下。关闭并且重启Eclipse,如果插件安装成功,那么在界面的左上角应该可以看到Tomcat的图标(转载者注:一只小猫,另一只小猫身上带着一个红叉)。现在我们来配置Sysdeo插件的参数,在Eclipse里“Windows->Preferences”,选择“Tomcat”标签,选择“Version 5.x”版本,然后修改参数“Tomcat Home”为“{Liferay}\ext\servers\tomcat”,在我这里也就是“D:\liferay\ext\servers\tomcat ”;修改参数“Configuration File”为“{Liferay}\ext\servers\tomcat\conf\server.xml”,在我这里也就是
“D:\liferay\ext\servers\tomcat\conf\server.xml”。
接着我们要继续给Tomcat执行的JVM虚拟机增加运行参数,启用JAAS支持以及扩大默认内存占用量,也就是展开“Tomcat”标签,选择“JVM Settings”,在“Append to JVM Parameters”选择“Add”,先添加
-Djava.security.auth.login.config=d:\liferay/ext/servers/tomcat/conf/jaas.config
再添加
-Xmx512m
还要在这里修改Tomcat运行所使用的虚拟机,要注意这里必须指定一个JDK附带的虚拟机而不可以指向JRE附带的虚拟机环境,否则Tomcat在运行过程中会出现错误。如果这里的下拉选项没有出现与JDK中虚拟机有关的选项,那么我们要首先手动建立一个,我们需要到Java标签下的“Installed JREs”,选择“Add”,“JRE home directory”选择“C:\j2sdk1.4.1_07”,给这个JRE环境起个名字,比如“J2SDK1.4.1_07”,之后点Ok保存设置,再重新开启“Window->Preferences”对话框,到Tomcat的“JVM Settings”项选择刚才建立的“J2SDK1.4.1_07”这个JRE就可以了。
这样,只要再配置好Liferay的数据库连接参数,就可以通过点击Eclipse里面的Tomcat图标启动Tomcat服务器了。(转载者注:
可以通过浏览器测试。地址http://localhost:8080)
________________________________________
3.3 配置数据库和执行Liferay
这里选择了使用MySql数据库,到MySql官方网站下载
MySql在Windows下的可执行包mysql-5.0.21-win32.zip、
MySql的JDBC驱动程序mysql-connector-java-3.1.12.zip、
MySql管理工具mysql-administrator-1.1.9-win.msi、
MySql数据查询工具mysql-query-browser-1.1.20-win.msi、
MySql数据建模工具mysql-workbench-1.0.6-beta-win32.msi。
除JDBC驱动外,其他几个包都可以双击执行安装向导完成。安装完毕后,使用MySql数据查询工具Query Browser连接数据库,选择
“File->Open Script”载入D:\liferay\ext\sql\create 目录下的create-mysql.sql 文件,点击“Execute”按钮执行。刷新会发现得到了新的数据库实例lportal。
使用MySql管理工具administrator,以root用户连接数据库,点“User Administration”,在左下方用户帐号列表一栏点击右键
,建立新用户liferay,输入密码sql606,点击“Schema Privileges”标签,点击lportal数据库,把除了grant权限外的所有权限
都给liferay这个用户,点击“Apply changes”按钮保存这个新账户。这样完成了数据导入以及建立MySql数据库用户的过程。
编辑D:\liferay\ext\servers\tomcat\conf\Catalina\localhost 目录下的ROOT.xml文件,将其中的
name="jdbc/LiferayPool"
auth="Container"
type="javax.sql.DataSource"
driverClassName="org.hsqldb.jdbcDriver"
url="jdbc:hsqldb:test"
username="sa"
password=""
maxActive="20"
/>
替换为
name="jdbc/LiferayPool"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/lportal?useUnicode=true&characterEncoding=UTF-8"
username="liferay"
password="sql606"
maxActive="100"
maxIdle="30"
maxWait="10000"
/>
请注意,这里如果按照官方文档的说法设置会出现错误,官方文档将数据库url中的“&”错误地写成了“&”,会造成Tomcat启动失败。
再解压MySql的JDBC驱动程序mysql-connector-java-3.1.12.zip 中的mysql-connector-java-3.1.12-bin.jar 文件,复制到
D:\liferay\ext\servers\tomcat\common\lib 目录下,使得Liferay能够找到MySql的JDBC驱动。
这样数据库有关的内容已经全部配置完成,可以点击Eclipse里面的Tomcat图标启动Liferay了,如果没有出现错误,那么已经可以用浏览器访问http://localhost:8080 访问到Liferay Professional版本的Tomcat服务。
这里要注意,Sysdeo插件与Liferay的Tomcat绑定二进制包默认指定的Hypersonic数据库驱动有冲突,所以我们在本节使用了MySql
数据库。如果一定要使用Hypersonic数据库的话,就不能通过Sysdeo插件启动Tomcat,而需要直接执行
D:\liferay\ext\servers\tomcat\bin目录下的startup.bat来启动。
3.4 完成一个最简单的JSP的Portlet
我们通过完成一个最简单的类似Hello World那样的JSP Portlet来展示Portlet的基本组成部分,更复杂的功能或者基于Structs等框架的Portlet请参见后续文档。
在D:\liferay\ext\ext-web\docroot\html\portlet\ext 目录建立一个新的文件夹myjspportlet 。接着打开D:\liferay\ext\ext-web\docroot\WEB-INF 文件夹下的portlet-ext.xml 文件进行编辑,加入对这个即将建立的新Portlet的描述,如下:
其中各项的含义为:
portlet-name 描述此Portlet的规定名称,这个名称必须是唯一不重复的。
display-name 记录此Portlet在Portal中的显示名称,在将Portlet加入到Portal中时如果看到了这个名字,那么就可以找到现在编写的这个Portlet组件,此名称不必是唯一的。
portlet-class 描述与此Portlet对应的Java类的完整路径。
init-param 通过name/value对的形式指定此Portlet初始化时的参数。
expiration-cache 定义Portlet输出缓存的超时时间,以秒为单位,超出这里指定的时间后就认为Portlet的输出已经超时了,如果这里是-1则说明输出永远不超时。
supports 包括所支持的MIME格式,同时定义对一种特定的MIME格式,此Portlet所支持的模式,所有的Portlet都必须支持View模式。
portlet-info 定义Portlet有关的信息。
security-role-ref 包含Web应用与系统角色之间的映射,在Liferay中,这里表示什么样的角色有权限访问此Portlet。(
一般来讲,Power User有权个人化Portal,而User无权进行个人化)
现在我们已经完成了对Portlet的描述,现在我们建立此Portlet的JSP页面,到刚才创建的myjspportlet目录下,建立一个名为init.jsp的文件,加入如下两行:
<%@ include file="/html/common/init.jsp" %>
这两行导入了每个Portlet都要包含的公共class文件以及公共变量,如果需要导入此Portlet专用的类或者进行此Portlet专用的变量的初始化,那么可以仿照common/init.jsp 文件中的写法写在myjspportlet目录下的init.jsp文件中。再添加一个名为view.jsp的文件,此文件将包含Portlet要输出的内容,再文件中写入“Hello [your name here]!”。Portal能够找到并且执行这个JSP文件是因为我们在portlet-ext.xml文件中的init-param标签指定了view-jsp参数的值是/ext/myjspportlet/view.jsp ,这个JSP文件就被作为默认的JSP页面被显示了。
最后,我们需要在D:\liferay\ext\ext-ejb\classes\content 目录下的Language-ext.properties 文件中加入下面这行,才能在
Portal中加入我们创建的这个Portlet:
javax.portlet.title.EXT_2=My JSP Portlet
因为我们已经创建了扩展开发环境,因此我们可以通过Ant脚本来向Portal添加我们新创建的这个Portlet。在Eclipse的Ant视图中
,导入D:\liferay\ext 目录下的build.xml文件,之后执行deploy [default]这个Ant任务,就可以完成新Portlet的发布。当这个
任务执行完毕,启动Tomcat,登陆系统,就可以在“添加内容”功能中找到我们新创建的Portlet了。
4. 改进和调试Liferay自身代码
本节将建立一个编译、调试Liferay自身代码的环境。如果希望参与Liferay社区对Liferay Portal的改进开发、提交补丁等,则需要按照本节的说明配置开发环境。
此外,本节也能建立一种开发和调试Portlet组件的环境,依赖于Orion服务器的热部署特性,能够实现对Portlet组件的实时调试。但是,由于本节的调试环境是一个完整的J2EE环境,因此也是比基于Tomcat的方法更为沉重庞大的选择,也说不上简洁高效。具
体做Portlet开发时还要根据自己工作的具体状况和对J2EE的熟悉程度选择一种Portlet开发环境。
4.1 安装Orion服务器
Liferay官方在开发时使用的就是Orion服务器,因此虽然可以使用其他的J2EE Server配置开发环境,我们还是选择了Orion。而且Orion服务器对开发者和非商业应用提供一个免费使用的授权,同时文档支持和应用程序的热部署功能也不错,还是值得推荐的。
首先到Orion的官方网站http://www.orionserver.com 下载Orion服务器的二进制文件,我选择的是2.0.6版本,那会是一个zip压缩包。将这个压缩包中的内容解压到C:\j2sdk1.4.1_07\orion 目录下。这时进入这个目录,使用“java -jar orion.jar”指令应
该能够在http://localhost 上运行起来了。
4.2 在Eclipse中配置Orion
在Eclipse中通过“Run->Debug..”菜单进入Debug环境设置对话框。在“Java Application”下面有个“orion”标签,我们需要修改这个标签下面的参数。
“Main”标签下的“Project”项需要改为“Portal”,原来写的是“ext”,其他的选项保持默认的即可,也即“Main class”一项仍保持为“com.evermind.server.ApplicationServer”。
“Arguments”标签下,开始Eclipse会报错,说“${ORION_HOME}”变量没有定义,我们点击“Program arguments”栏目下的“Variables”按钮,在新弹出的对话框中点击“Edit Variables...”按钮,点击“New”,“Name”项输入“ORION_HOME”,“Value”项输入“C:\j2sdk1.4.1_07\orion”,点击3次Ok关闭对话框。这样“Program arguments”栏仍保持为“-config
${ORION_HOME}/config/server.xml -userThreads”;“VM arguments”还保持为“-Xbootclasspath/a:${workspace_loc}\portal\lib\xercesImpl.jar;${workspace_loc}\portal\lib\xml-apis.jar -Xmx512m -Dfile.encoding=UTF-8 -Duser.timezone=GMT”。
在“Classpath”标签下,将“User Entries”下带环境变量的orion.jar引用路径删除,然后点击“Add External JARs”按钮,重新添加本机上的orion.jar库文件。
在“JRE”标签,选择“Alternate JRE”,改为“j2sdk1.4.1_07”,如果这里使用纯JRE的运行环境而不是JDK附带的运行环境,很可能会造成Orion运行中的一些编译类的错误。
4.3 修改Orion配置参数
编辑C:\j2sdk1.4.1_07\orion\config\server.xml 文件,在行
下面添加行
并且加入行
来启用jikes编译器。其中C:\j2sdk1.4.1_07/jre/lib/rt.jar 指向JDK附带的JRE运行环境库。如果不启用jikes,则会使用sun的JDK附带的编译器,可能与Liferay代码造成冲突,因此建议启用jikes。
建立新目录C:\j2sdk1.4.1_07\orion\config\web-sites ,在其中建立文件portal.liferay.com-web.xml ,文件内容如下:
我没有找到test-web和axis-web包,因此我没有启用这两项。编辑C:\j2sdk1.4.1_07\orion\config\application.xml文件,添加如下行:
[Get Code]
官方文档说如果使用了“80%9d\j2sdk1.4.1_07\orion\applications\bf%99a0e7%9a%84ae%9abd%8d96e58fbc%8c88%99a6%81bf%9daf%819cgreen%C:' rel='nofollow'>file:”这样的定位方式,则要保证在C: 目录中没有portal-ejb.jar文件,通常这个文件产生于Ant脚本的Deploy过程。不过我不清楚官方文档为什么提出这一点,也没发现有什么影响。可能如果存在这个jar文件,则源码
目录下的classes文件都会被覆盖,这样如果只是修改并编译了源码目录下的classes文件,很可能由于jar文件的覆盖而没法生效,给调试带来麻烦。接着配置MySql数据源,参考3.3节配置数据库和执行Liferay的做法,在数据库中建立与Liferay对应的数据库lportal,将MySql
的Java版本驱动的jar文件复制到C:\j2sdk1.4.1_07\orion\lib 目录下。再编辑C:\j2sdk1.4.1_07\orion\config\data-sources.xml ,使之内容如下:
class="com.evermind.sql.DriverManagerDataSource"
name="Liferay"
location="jdbc/LiferayCore"
pooled-location="jdbc/LiferayPool"
xa-location="jdbc/xa/LiferayXA"
ejb-location="jdbc/LiferayEJB"
connection-driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/lportal"
username="liferay"
password="sql606"
inactivity-timeout="30"
schema="database-schemas/"
/>
4.4 修改Liferay的配置文件
Liferay使用一个名为portal.properties 的文件来配置一些重要的参数,但我们一般不要直接修改这个文件,而是另外写一个配置文件来覆盖里面的设置即可,这样可以比较容易地使我们的修改与Liferay的官方设置相兼容。在D:\liferay\portal\util-java\classes 目录下建立一个名为portal-ext.properties的文件(官方文档写这个文件的存放位置写错了)。填写这个文件的内容为:
portal.ctx=/portal
4.5 向Orion上部署Liferay系统
在D:\liferay\portal\ 目录建立一个app.server.{username}.properties 文件,在我的机器上就是app.server.Administrator.properties 文件({username}的含义参考“3.1节配置扩展开发环境”,文件内容为app.server={orion}在我这写的就是
app.server=C:/j2sdk1.4.1_07/orion
到Eclipse的Ant视图顺序执行portal项目中的start和deploy任务。记得删除portal-ejb.jar文件。在Eclipse中用Debug界面启动Orion,这时应该可以在http://localhost:8080 看到启动的Liferay了。(如果Ant脚本运行的时候
说什么javac类找不到,那么调整Eclipse菜单中的:Windows->Preferences窗口中的Ant配置,把JDK的lib目录下的tools.jar文件显式引用进去,就一切正常了(不可以是JRE的lib目录下的tools.jar文件,那不一样)。)
4.6 另一种调试Portlet组件的方法
在Liferay的portal源码工作环境下,还有一种开发调试Portlet组件的方法。我们用D:\liferay\portal\portlets\sample-jsp-portlet.war这个Liferay自带的Portlet作为例子。
我们将D:\liferay\portal\portlets\sample-jsp-portlet.war 目录复制成为D:\liferay\sample-jsp-portlet 目录,之后修改C:\j2sdk1.4.1_07\orion\config\application.xml文件,添加如下行
再修改C:\j2sdk1.4.1_07\orion\config\web-sites\portal.liferay.com-web.xml 文件,在其中添加如下行
之后重启Orion,登陆Liferay后就可以在“Add Content”界面的Test类别中找到这个sample-jsp-portlet。