使用 Ant 构建 Liferay Theme过程分析

简介:

 记录今天吧Liferay项目从Ant切换到Maven的教训吧。

为了明天的Demo,我们吧所有原来用Ant构建的Liferay项目全部切换到了Maven,结果在把Maven构建的某个theme应用部署到Liferay服务器时始终看不到效果。我忙活了半个小时,才发现了原因,是因为_diffs下面的内容根本就没有复制到Theme根目录中。

因为我们以前都是用Ant来打包和部署的,而Liferay的Ant脚本会自动的把_diffs下面的所有资源都merge到外层(也就是theme应用根目录下)。我们当时以为_diffs 直接复制过去就可以了,也没有看最终artifact的结构。所以就出错了。

 

回到家,我仔细的看了Liferay Ant构建Theme项目的过程,原来_diffs目录是在执行create 的target时候创建的,并且它的作用仅仅是方便开发者去更改与框架不同的资源。所以切换到Maven,这个目录本身没任何作用,只有这个目录下的内容才有用

 

创建:

 
 
  1. <target name="create"> 
  2.         <if> 
  3.             <or> 
  4.                 <not> 
  5.                     <isset property="theme.name" /> 
  6.                 </not> 
  7.                 <not> 
  8.                     <isset property="theme.display.name" /> 
  9.                 </not> 
  10.             </or> 
  11.             <then> 
  12.                 <echo message="This task must be called by create.bat." /> 
  13.             </then> 
  14.             <else> 
  15.                ...
  16.                 <copy todir="${theme.dir}"> 
  17.                     <fileset 
  18.                         dir="${project.dir}/tools/theme_tmpl" 
  19.                     /> 
  20.                 </copy> 
  21.  
  22.                 <mkdir dir="${theme.dir}/docroot/_diffs" /> 
  23.  
  24.                 <replace dir="${theme.dir}"> 
  25.                     <replacefilter token="@theme.name@" value="${theme.name}" /> 
  26.                     <replacefilter token="@theme.display.name@" value="${theme.display.name}" /> 
  27.                 </replace> 
  28.             </else> 
  29.         </if> 
  30.     </target> 

 

编译:

而编译target时,Ant会吧服务器上的相关资源都复制到当前theme应用的docroot目录中,见40-52行,58-63行,65-68行,

 
 
  1. <target name="compile"> 
  2.         ...
  3.         <if> 
  4.             <not> 
  5.                 <isset property="theme.type" /> 
  6.             </not> 
  7.             <then> 
  8.                 <property name="theme.type" value="vm" /> 
  9.             </then> 
  10.         </if> 
  11.  
  12.         <if> 
  13.             <equals arg1="${theme.parent}" arg2="_unstyled" /> 
  14.             <then> 
  15.                 <copy todir="docroot" overwrite="true"> 
  16.                     <fileset 
  17.                         dir="${app.server.portal.dir}/html/themes/_unstyled" 
  18.                         excludes="templates/**" 
  19.                     /> 
  20.                 </copy> 
  21.  
  22.                 <copy todir="docroot/templates" overwrite="true"> 
  23.                     <fileset 
  24.                         dir="${app.server.portal.dir}/html/themes/_unstyled/templates" 
  25.                         excludes="init.${theme.type}" 
  26.                         includes="*.${theme.type}" 
  27.                     /> 
  28.                 </copy> 
  29.             </then> 
  30.             <elseif> 
  31.                 <equals arg1="${theme.parent}" arg2="_styled" /> 
  32.                 <then> 
  33.                     <copy todir="docroot" overwrite="true"> 
  34.                         <fileset 
  35.                             dir="${app.server.portal.dir}/html/themes/_unstyled" 
  36.                             excludes="templates/**" 
  37.                         /> 
  38.                     </copy> 
  39.  
  40.                     <copy todir="docroot/templates" overwrite="true"> 
  41.                         <fileset 
  42.                             dir="${app.server.portal.dir}/html/themes/_unstyled/templates" 
  43.                             excludes="init.${theme.type}" 
  44.                             includes="*.${theme.type}" 
  45.                         /> 
  46.                     </copy> 
  47.  
  48.                     <copy todir="docroot" overwrite="true"> 
  49.                         <fileset 
  50.                             dir="${app.server.portal.dir}/html/themes/_styled" 
  51.                         /> 
  52.                     </copy> 
  53.                 </then> 
  54.             </elseif> 
  55.             <elseif> 
  56.                 <equals arg1="${theme.parent}" arg2="classic" /> 
  57.                 <then> 
  58.                     <copy todir="docroot" overwrite="true"> 
  59.                         <fileset 
  60.                             dir="${app.server.portal.dir}/html/themes/classic" 
  61.                             excludes="_diffs/**,templates/**" 
  62.                         /> 
  63.                     </copy> 
  64.  
  65.                     <copy todir="docroot/templates" overwrite="true"> 
  66.                         <fileset 
  67.                             dir="${app.server.portal.dir}/html/themes/classic/templates" 
  68.                             includes="*.${theme.type}" 
  69.                         /> 
  70.                     </copy> 
  71.                 </then> 
  72.             </elseif> 
  73.             <elseif> 
  74.                 <isset property="theme.parent" /> 
  75.                 <then> 
  76.                     <ant dir="${theme.parent}" target="compile" inheritAll="false" /> 
  77.  
  78.                     <copy todir="docroot" overwrite="true"> 
  79.                         <fileset 
  80.                             dir="${theme.parent}/docroot" 
  81.                             excludes="_diffs/**,WEB-INF/*.properties,WEB-INF/*.xml" 
  82.                         /> 
  83.                     </copy> 
  84.                 </then> 
  85.             </elseif> 
  86.         </if> 
  87.  
  88.      ...
  89.     </target> 

 

然后会吧_diffs目录下面的资源复制(如果存在则取代)外层,也就是theme根目录下平行目录下的资源,见如下代码:

 
 
  1. <if> 
  2.     <available file="docroot/_diffs" /> 
  3.     <then> 
  4.         <copy todir="docroot" overwrite="true"> 
  5.             <fileset 
  6.                 dir="docroot/_diffs" 
  7.             /> 
  8.         </copy> 
  9.     </then> 
  10. </if> 

 

接着把非静态资源的其他文件(比如类文件,去除源代码文件)复制到docroot/WEB-INF目录下:

 
 
  1. <if> 
  2.         <available file="docroot/WEB-INF/src" /> 
  3.         <then> 
  4.             <mkdir dir="docroot/WEB-INF/classes"/> 
  5.  
  6.             <copy todir="docroot/WEB-INF/classes"> 
  7.                 <fileset dir="docroot/WEB-INF/src" excludes="**/*.java" /> 
  8.             </copy> 
  9.         </then> 
  10.     </if> 

 

打包:

最后,在打包过程中,它会先吧css资源弄过去:

 
 
  1. <target name="build-css"> 
  2.         <java 
  3.             classname="com.liferay.portal.tools.SassToCssBuilder" 
  4.             classpathref="portal.classpath" 
  5.             fork="true" 
  6.             newenvironment="true" 
  7.         > 
  8.             <jvmarg value="-Dliferay.lib.portal.dir=${app.server.lib.portal.dir}" /> 
  9.             <arg value="sass.dir=${basedir}/docroot" /> 
  10.         </java> 
  11.     </target> 

 

最后会吧docroot下面所有的文件,去除_diffs目录下的文件(因为这些文件已经在compile过程中复制替换掉_diffs目录外面的同名文件了),再压缩成war包,见10-14行:

 
 
  1. <target name="war" depends="compile"> 
  2.         <antcall target="build-css" /> 
  3.  
  4.         ...
  5.  
  6.         <mkdir dir="${project.dir}/dist" /> 
  7.  
  8.         <delete file="${plugin.file}" /> 
  9.  
  10.         <zip 
  11.             basedir="docroot" 
  12.             destfile="${plugin.file}" 
  13.             excludes="_diffs.*,_diffs/**" 
  14.         /> 
  15.     </target> 

 

最终Ant打包完的theme解压开应该是如下的目录结构(这里看出,最终成品是不含有_diffs 目录的):

 

结论:

综上所述:_diffs目录仅仅是给程序员开发方便而设置的一个目录,它不是theme所特有的,我们今天移植到Maven时候居然保留了这个目录,难怪用Maven构建的项目不可用呢。

 

 

明天会给出用Maven构建theme的例子





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/890704,如需转载请自行联系原作者

目录
相关文章
|
Android开发
【错误记录】Android Studio 中 build.gradle 配置 buildFeatures prefab 错误处理 ( AS 4.1 以上开发环境 | Gradle及插件版本 )
【错误记录】Android Studio 中 build.gradle 配置 buildFeatures prefab 错误处理 ( AS 4.1 以上开发环境 | Gradle及插件版本 )
1464 0
【错误记录】Android Studio 中 build.gradle 配置 buildFeatures prefab 错误处理 ( AS 4.1 以上开发环境 | Gradle及插件版本 )
|
Java Maven 数据安全/隐私保护
Gradle 项目的生命周期和settings文件
Gradle 项目的生命周期和settings文件
Gradle 项目的生命周期和settings文件
学习笔记jira项目30-ant design组件库
学习笔记jira项目30-ant design组件库
46 0
学习笔记jira项目30-ant design组件库
学习笔记jira项目29-ant design组件库
学习笔记jira项目29-ant design组件库
57 0
|
前端开发
【Ant Design Pro】使用ant design pro做为你的开发模板(七)如何动态加载菜单列表
【Ant Design Pro】使用ant design pro做为你的开发模板(七)如何动态加载菜单列表
644 0
【Ant Design Pro】使用ant design pro做为你的开发模板(七)如何动态加载菜单列表
|
前端开发
015 在 Umi 中使用 Ant Design 编写全局布局
015 在 Umi 中使用 Ant Design 编写全局布局
2191 0
015 在 Umi 中使用 Ant Design 编写全局布局
|
XML Java 应用服务中间件
eclipse关于xml文件有两种方式显示 Design方式-图形化方式,Source-源码方式
eclipse关于xml文件有两种方式显示 Design方式-图形化方式,Source-源码方式
1021 0
eclipse关于xml文件有两种方式显示 Design方式-图形化方式,Source-源码方式
|
Web App开发 JavaScript 前端开发
SAP UI5 Custom Cordova plugin的调试方法
SAP UI5 Custom Cordova plugin的调试方法
SAP UI5 Custom Cordova plugin的调试方法
项目中引入Ant Design
项目中引入Ant Design
172 0
项目中引入Ant Design