Liferay 6.1开发学习(五):编译调试修改源码

2012年09月21日 Liferay 评论 32 条 阅读 33,247 views 次

Liferay是一个开源的项目,开源项目的好处有两个,一方面我们可以通过阅读源码提高水平,了解一些技术的实现原理,另一方面是如果开源的产品不能满足我们的实际需求,可以通过修改源码实现。Liferay CE版可以免费获取源码,EE版需要购买过产品才能获取源码。

以下文件虽然是基于Liferay 6.1.1所写,但Liferay 6.2.0版本同样适用,方法、过程、需要注意事项等均一致

一、导入源码

源码可以从Liferay的官方网站上下载。http://www.liferay.com/downloads/liferay-portal/available-releases

下载后解压源码,可以使用Eclipse的File-->Import-->General-->Existing Projects in to Workspace。将解压的源码导入到Eclipse中。

导入源码后,如果是6.1.1的源码,可能会出现如下的错误:Project 'portal-trunk' is missing required source folder: 'portal-web/test'。此错误是说在build path下面找不到test目录。解决方法有两个(6.2.0中导入源码后,也有类似问题,解决方法同下面两个原理一样):

1、在portal-web下面建立一个名为test的目录。

2、打开源码工程目录下面的.classpath文件(使用文本编辑器打开,editplus或notepad++),在其中找到<classpathentry excluding="**/.svn/**|.svn/" kind="src" path="portal-web/test"/>(大概在11行),将此行注释掉或删除。然后回到Eclipse中刷新工程(选中工程按F5,或在右键菜单中选择刷新)。

二、编译源码

既然要调试源码,首先是需要能够对源码进行编译。Liferay的源码不是一个普通的Web工程,不能使用普通的方法进行编译部署。但liferay官方已经提供了相应的ant脚本进行编译部署,但首先还需要一些简单的设置。

1、打开liferay的源码目录,找到app.server.properties文件。

2、将些文件复制一份,重命名为app.server.{username}.properties的文件,其中的{username}为当前系统的帐号名称。如我的系统帐号是huqiwen,则将其命名为app.server.huqiwen.properties即可。具体的可以打开CMD,以里面显示用户名为准。如下图:

系统用户名

3、打开此文件,找到app.server.parent.dir=${project.dir}/../bundles。将后面的${project.dir}/../bundles替换为下载的绑定Liferay的Tomcat的路径,如我的为E:/code/liferay6.1/liferay-portal-6.1.1-ce-ga2,则修改后的地址为: app.server.parent.dir=E:/code/liferay6.1/liferay-portal-6.1.1-ce-ga2。注意:从地址栏里面复制的地址为正斜杠,请修改成反斜杠。

4、现在Eclipse的ant面板里面点击,add buildfiles,将portal源码里面的build.xml文件添加到ant面板里面。

5、点开此build文件,先点击compile,再点击deploy,即可将源码编译部署到tomcat中。

三、debug源码

在二的基础上deploy后,即可对liferay的相关源码进行编译调试。如果是第一次进行debug,可能会跳转到显示Source not found,此时,点击下面的“edit source lookup path”,在弹出的对话框里面点击Add -->Java Project,在这里将我们的Portal-trunk工程勾选上,点击OK等,即可开始Liferay的源码调试。

四、常见问题

1、在编译的时候出现如下错误

Task cannot continue because ECJ is not installed.

ECJ was automatically installed. Please rerun your task.

这个问题在前面的博客里面提到过,http://www.huqiwen.com/2012/09/01/liferay-6-1-development-study-2-create-portlet-project/

解决方法为:

原因是ECJ包没有找到,ECJ是什么?ECJ, the Eclipse Compiler for Java, is an open source incremental compiler used by the Eclipse JDT. It is an option for Liferay builds and is in many cases faster than Javac or Jikes. The jar for ECJ is included in Liferay release 4.4.0 and later.http://www.liferay.com/community/wiki/-/wiki/Main/ECJ这是官方解释。大概意思是ECJ是一个编译优化包,可以提升比Javac和JIKES更好的编译速度。要想使编译通过,有两个两个方法:

方法一:禁用ECJ。在Liferay的SDK下面找到build.Administrator.properties,此处中间的Administrator名称不一定是这样的,具体体系名称是根据当前系统的用户名生成的。在里面添加如下内容

javac.compiler=modern
#javac.compiler=org.eclipse.jdt.core.JDTCompilerAdapter

方法二:将ECJ的包添加到ant的路径里面。ecj.jar包可以在Liferay的工程的源码包\lib\development下面找到。将此包添加到ant的路径里面。Windows-->preferences-->Ant-->Runtime,在右边的Classpath-->Ant Home Entries(Default) -->Add External JARs,将ecj包添加进来。

2、在编译源码的时候出现:

Please set the environment variable ANT_OPTS to the recommended value of
"-Xmx1024m -XX:MaxPermSize=512m".

这个提示的意思是说当前的JVM参数设置的太小了,不够liferay编译使用,需要增加JVM内存的分配,并建议将Xmx参数设置成1024m,MaxPermSize设置成512m。这是因为liferay的源码比较大,内容比较多,使用了大量的classloader等,需要比较大的内存。

解决方法上面已经给出提示了将环境变量(其实就是JVM的参数)推荐设置成上面的提示。

1)在Liferay工程的源码里面的build.xml上点击右键-->Run as-->External Tool Configurations

2)在tab标签里面找到Environment,点击new,在name里面输入ANT_OPTS,在value里面输入-Xmx1024m -XX:MaxPermSize=512m,然后点击apply。

3)再次运行ant的编译,即可正常编译。

3、如果出现类似如下错误,请参考上文的“二、编译源码”

Tomcat is not installed in E:/liferay/6.2/bundles/tomcat-7.0.42. If you already have Tomcat
installed, make sure the property "${app.server.tomcat.dir}" points to your
Tomcat installation. If you wish to automatically install Tomcat into

用户头像

32 条留言  访客:22 条  博主:7 条   引用: 3 条

  1. 您好!
    三、debug源码
    这步骤不是很明白,如何启动tomcat?如何设置断点的?

  2. ant编译成功后,tomcat的root并没有什么变化。我访问html下的jsp页面都会报错

  3. 我在用ant编译portal-web的themes时报错:
    Could not find com.liferay.portal.tools.ThumbnailBuilder. Make sure you have it in your classpath
    在这之前需要什么配置吗?

  4. deploy 中 com.liferay.util.ant.bnd.BaselineJarTask cannot be found

    这个去那里添加, 怎么添加

  5. 1, ant的时候别clean 要不然得重新解压。
    2, 胡楼主的第三部,debug ,菜鸟的可以飘过。等了解了很多liferay再debug。

  6. liferay6.2部署源码报
    BUILD FAILED
    E:\liferaysrc\liferay-portal-src-6.2-ce-ga2\build.xml:207: The following error occurred while executing this line:
    E:\liferaysrc\liferay-portal-src-6.2-ce-ga2\build-common-java.xml:113: The following error occurred while executing this line:
    E:\liferaysrc\liferay-portal-src-6.2-ce-ga2\build-common.xml:450: taskdef class com.liferay.util.ant.bnd.BaselineJarTask cannot be found

  7. ant编译遇到 taskdef class com.liferay.util.ant.bnd.BaselineJarTask cannot be found 这个问题,求解答 😥 😥

    • avatar 胡启稳

      1、确认你的工程上面没有错误,如果是初一次导入可以会提示有classpath里面有异常,是少了一个目录,有两个办法,一是到.classpath文件里面将这个目录注释,二是添加一个空的目录,比如在portal-web下面建立/test/functional
      2、确认工作区的编码为UTF-8

      照着博客上面的步骤操作,不会出问题,这个是我是已经操作过许多次的

  8. avatar 火乐石页

    您好,我现在在开发一个基于liferay的文档管理门户,新手想快速入门,请问哪里能找到liferay本身自带的portlet的源码工程,像文档媒体库什么的,看懂了可以直接方便直接二次开发了。我只知道从集市上安装的会直接部署在tomcat下,要把src拿出来重组,但是新手表示这个也不太会。

  9. 我这边在双击“compile”的时候出现以下的错误:

    Buildfile: D:\Alex\projectFile\LifeRay\tools\liferay-portal-src-6.1.1-ce-ga2\build.xml
    deploy:
    compile:
    [javac] Compiling 3981 source files to D:\Alex\projectFile\LifeRay\tools\liferay-portal-src-6.1.1-ce-ga2\portal-service\classes

    BUILD FAILED
    D:\Alex\projectFile\LifeRay\tools\liferay-portal-src-6.1.1-ce-ga2\build.xml:176: The following error occurred while executing this line:
    D:\Alex\projectFile\LifeRay\tools\liferay-portal-src-6.1.1-ce-ga2\portal-service\build.xml:32: java.lang.reflect.InvocationTargetException

    Total time: 12 seconds

    查了好久不知道什么错误,求解答。谢谢

  10. 关于debug问题 真心不知道怎么debug 因为源码都没有加载到Tomcat下面 难道说直接在ant下面complie和deploy 之后就能设置断点了?

    我的项目run 根本就进不到tomcat下面

  11. 胡老师,我是在Liferay 6.2 G6上安装sdk,Liferay server配置之后,就跟着您的步骤进行部署源码,进行到第一步,这二个方法都尝试过,但过一会,在Eclipse中的Makers中出现了–Java problem(100 of 9001 items)的提示; 接着第二步,在编译源码阶段时,在Console 中提示BUILD FAILED,并有错误提示。我是初学者,现在不知道如何解决,希望胡老师,能够指点迷津,解决这个难题,提前感谢胡老师的技术分享。

    • avatar 胡启稳

      1、看一下你的工作区的编码是不是UTF-8,修改成UTF-8
      2、然后再看是有什么样的具体的错误,problem里面只看err的部分。

  12. 胡老师:
    您好,按照您的指导,我将现有的环境进行删除,重新进行安装,再进行设置编码,并能通过创建portlet工程,但是,导入源码后,问题还是没有解决,在左侧的project explore 中出现红×,在Marker中提示的错误有两种:
    1. The type *** must implement the inherited abstract method ‘
    2. Type mismatch
    这两个问题是不是有环境有关,我的环境是Liferay 6.2 G6 ,jdk的版本是1.8 ,您看该怎么处理?
    感谢胡老师的技术分享。

  13. 胡老师,我在部署liferay7.0的源码报这个错误:
    BUILD FAILED
    D:\workspaces\workspace_liferay7_ga1-m3\portal-master\build.xml:282: The following error occurred while executing this line:
    D:\workspaces\workspace_liferay7_ga1-m3\portal-master\build-common-java.xml:314: The following error occurred while executing this line:
    D:\workspaces\workspace_liferay7_ga1-m3\portal-master\build-common-java.xml:114: The following error occurred while executing this line:
    D:\workspaces\workspace_liferay7_ga1-m3\portal-master\build-common-java.xml:133: The following error occurred while executing this line:
    D:\workspaces\workspace_liferay7_ga1-m3\portal-master\build-common-java.xml:145: The following error occurred while executing this line:
    D:\workspaces\workspace_liferay7_ga1-m3\portal-master\build-common-java.xml:261: The following error occurred while executing this line:
    D:\workspaces\workspace_liferay7_ga1-m3\portal-master\build-common-ivy.xml:64: HTTP Authorization failure

  14. 能不能把liferay-portl(liferay-portal-src-6.2-ce-ga6) 的源码,放到一个干净的tomcat中进行编译、调试、运行!如果可以 能否指点应该怎么弄 了

来自外部的引用: 3 条

  • Liferay 6.1开发学习(六):国际化 | IT人生录
  • Liferay 6开发学习(二十四):Liferay开发模式介绍 | IT人生录
  • 服务器日志中出现大量异常:file:/wap/portal/status.jsp not found | IT人生录

给我留言

您必须 登录 才能发表留言!

Copyright © IT人生录 保留所有权利.   主题设计 知更鸟 滇ICP备16001547号

用户登录

分享到: