使用 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,如需转载请自行联系原作者

目录
相关文章
|
7月前
|
JavaScript Android开发
Cordova 打包 Vue 项目到Android打开白屏
Cordova 打包 Vue 项目到Android打开白屏
105 0
Ant design组件库里面的Dropdown怎么写点击事件?
Ant design组件库里面的Dropdown怎么写点击事件?
|
前端开发
#yyds干货盘点 ant design form表单验证问题
#yyds干货盘点 ant design form表单验证问题
69 0
#yyds干货盘点 ant design form表单验证问题
flutter系列之:创建一个内嵌的navigation
我们在flutter中可以使用Navigator.push或者Navigator.pushNamed方法来向Navigator中添加不同的页面,从而达到页面调整的目的。 一般情况下这样已经足够了,但是有时候我们有多个Navigator的情况下,上面的使用方式就不够用了。比如我们有一个主页面app的Navigator,然后里面有一个匹配好友的功能,这个功能有多个页面,因为匹配好友功能的多个页面实际上是一个完整的流程,所以这些页面需要被放在一个子Navigator中,并和主Navigator区分开。
|
Java 开发工具
AndroidStudio插件开发(进阶篇之Action机制)
AndroidStudio插件开发(进阶篇之Action机制)
AndroidStudio插件开发(进阶篇之Action机制)
|
缓存 移动开发
网友需求 - 使用 50 行代码在 Ant Design Pro 中完成 Umi 状态保持的多tabs布局
网友需求 - 使用 50 行代码在 Ant Design Pro 中完成 Umi 状态保持的多tabs布局
2005 1
网友需求 - 使用 50 行代码在 Ant Design Pro 中完成 Umi 状态保持的多tabs布局
|
前端开发
015 在 Umi 中使用 Ant Design 编写全局布局
015 在 Umi 中使用 Ant Design 编写全局布局
2418 0
015 在 Umi 中使用 Ant Design 编写全局布局
|
前端开发 JavaScript Web App开发
Intro.js 分步向导插件使用方法
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w178191520/article/details/84181455 简介 为您的网站和项目提供一步一步的、更好的介绍 Intro.js 目前兼容 Firefox、Chrome 和 IE8,不兼容 IE6 和 IE7,后续版本将会提供更好的兼容。
1427 0