记录今天吧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,这个目录本身没任何作用,只有这个目录下的内容才有用。
创建:
- <target name="create">
- <if>
- <or>
- <not>
- <isset property="theme.name" />
- </not>
- <not>
- <isset property="theme.display.name" />
- </not>
- </or>
- <then>
- <echo message="This task must be called by create.bat." />
- </then>
- <else>
- ...
- <copy todir="${theme.dir}">
- <fileset
- dir="${project.dir}/tools/theme_tmpl"
- />
- </copy>
- <mkdir dir="${theme.dir}/docroot/_diffs" />
- <replace dir="${theme.dir}">
- <replacefilter token="@theme.name@" value="${theme.name}" />
- <replacefilter token="@theme.display.name@" value="${theme.display.name}" />
- </replace>
- </else>
- </if>
- </target>
编译:
而编译target时,Ant会吧服务器上的相关资源都复制到当前theme应用的docroot目录中,见40-52行,58-63行,65-68行,
- <target name="compile">
- ...
- <if>
- <not>
- <isset property="theme.type" />
- </not>
- <then>
- <property name="theme.type" value="vm" />
- </then>
- </if>
- <if>
- <equals arg1="${theme.parent}" arg2="_unstyled" />
- <then>
- <copy todir="docroot" overwrite="true">
- <fileset
- dir="${app.server.portal.dir}/html/themes/_unstyled"
- excludes="templates/**"
- />
- </copy>
- <copy todir="docroot/templates" overwrite="true">
- <fileset
- dir="${app.server.portal.dir}/html/themes/_unstyled/templates"
- excludes="init.${theme.type}"
- includes="*.${theme.type}"
- />
- </copy>
- </then>
- <elseif>
- <equals arg1="${theme.parent}" arg2="_styled" />
- <then>
- <copy todir="docroot" overwrite="true">
- <fileset
- dir="${app.server.portal.dir}/html/themes/_unstyled"
- excludes="templates/**"
- />
- </copy>
- <copy todir="docroot/templates" overwrite="true">
- <fileset
- dir="${app.server.portal.dir}/html/themes/_unstyled/templates"
- excludes="init.${theme.type}"
- includes="*.${theme.type}"
- />
- </copy>
- <copy todir="docroot" overwrite="true">
- <fileset
- dir="${app.server.portal.dir}/html/themes/_styled"
- />
- </copy>
- </then>
- </elseif>
- <elseif>
- <equals arg1="${theme.parent}" arg2="classic" />
- <then>
- <copy todir="docroot" overwrite="true">
- <fileset
- dir="${app.server.portal.dir}/html/themes/classic"
- excludes="_diffs/**,templates/**"
- />
- </copy>
- <copy todir="docroot/templates" overwrite="true">
- <fileset
- dir="${app.server.portal.dir}/html/themes/classic/templates"
- includes="*.${theme.type}"
- />
- </copy>
- </then>
- </elseif>
- <elseif>
- <isset property="theme.parent" />
- <then>
- <ant dir="${theme.parent}" target="compile" inheritAll="false" />
- <copy todir="docroot" overwrite="true">
- <fileset
- dir="${theme.parent}/docroot"
- excludes="_diffs/**,WEB-INF/*.properties,WEB-INF/*.xml"
- />
- </copy>
- </then>
- </elseif>
- </if>
- ...
- </target>
然后会吧_diffs目录下面的资源复制(如果存在则取代)外层,也就是theme根目录下平行目录下的资源,见如下代码:
- <if>
- <available file="docroot/_diffs" />
- <then>
- <copy todir="docroot" overwrite="true">
- <fileset
- dir="docroot/_diffs"
- />
- </copy>
- </then>
- </if>
接着把非静态资源的其他文件(比如类文件,去除源代码文件)复制到docroot/WEB-INF目录下:
- <if>
- <available file="docroot/WEB-INF/src" />
- <then>
- <mkdir dir="docroot/WEB-INF/classes"/>
- <copy todir="docroot/WEB-INF/classes">
- <fileset dir="docroot/WEB-INF/src" excludes="**/*.java" />
- </copy>
- </then>
- </if>
打包:
最后,在打包过程中,它会先吧css资源弄过去:
- <target name="build-css">
- <java
- classname="com.liferay.portal.tools.SassToCssBuilder"
- classpathref="portal.classpath"
- fork="true"
- newenvironment="true"
- >
- <jvmarg value="-Dliferay.lib.portal.dir=${app.server.lib.portal.dir}" />
- <arg value="sass.dir=${basedir}/docroot" />
- </java>
- </target>
最后会吧docroot下面所有的文件,去除_diffs目录下的文件(因为这些文件已经在compile过程中复制替换掉_diffs目录外面的同名文件了),再压缩成war包,见10-14行:
- <target name="war" depends="compile">
- <antcall target="build-css" />
- ...
- <mkdir dir="${project.dir}/dist" />
- <delete file="${plugin.file}" />
- <zip
- basedir="docroot"
- destfile="${plugin.file}"
- excludes="_diffs.*,_diffs/**"
- />
- </target>
最终Ant打包完的theme解压开应该是如下的目录结构(这里看出,最终成品是不含有_diffs 目录的):
结论:
综上所述:_diffs目录仅仅是给程序员开发方便而设置的一个目录,它不是theme所特有的,我们今天移植到Maven时候居然保留了这个目录,难怪用Maven构建的项目不可用呢。
明天会给出用Maven构建theme的例子