Liferay 部署war包时候的deployDirectory 细节分析

引入:

在上文中,我们从宏观上讲解了Liferay部署war包的动作是如何触发监听器并且完成部署过程的,但是其中最核心的一块deployDirectory我们没讲,它的作用是当有了临时目录并且已经把war包的内容展开到该目录之后,是如何对其中内容进行解析,再加工并且最终复制到最终的部署目录deployDir的,我们这里就研究这块内容:


调试分析:

首先,我们看下这个复杂方法的入参:

132716489.png


srcFile参数是我们临时目录,也就是被展开的war文件对应的目录。

132944846.png

mergeDir是一个目录,用于merge的,我们设置为在LIFERAY部署目录($LIFERAY_HOME/deploy)中建一个merge目录,然后以我们的war包名字为子目录,如下:

133154903.png

deployDir不用说了, 也就是在tomcat的webapps目录下我们的应用最终要放置到的目录:

133310746.png

后面3个参数不用说了。


我们开始分析:

首先在第514行调用rewriteFiles去重写临时目录中srcDir中的几个文件:

133944579.png

代码我不贴了,一看就懂,它的目的是对于web.xml, liferay-plugin-package.xml,liferay-display.xml,liferay-portlet.xml,portlet.xml这5个文件进行子元素的缩进,并且缩进量都是一个制表符的距离。所以最终文件都会变成:

<parent-ele>

       <child-ele>

这种缩进格式


接着在第516行中调用mergeDirectory(mergeDir,srcFile)方法,.因为我们的mergeDir为空,所以直接这段代码跳过。


接着在第518行调用processPluginPackageProperties(srcFile,displayName,pluginPackage)对于plugin package的properties文件进行处理,因为我们没有liferay-plugin-package.properties,取而代之我们是用xml文件的,所以这段代码也跳过。


接着会在第520行调用copyJars(srcDir,pluginPackage) 方法,

135729896.png

他们会吧$CATALINA_HOME/liferay/com/liferay/portal/deploy/dependencies目录下的多个jar文件

分别复制到我们srcFile指定的portlet临时目录下的WEB-INF/lib目录下。

细心的你一定会问,为什么突然多出来$CATALINA_HOME/liferay/com/liefray/portal/deploy/dependencies目录,为什么会有这么多jar文件?其实我也不知道,我们在最后“精华疑点解答中”会分析,这里姑且假定这个目录已经存在并且由这些jar文件吧。


然后在第521行调用copyProperties(srcFile,pluginPackage)方法。

140717531.png

细节我省去了,它会去吧logging.properties,log4j.properties,service.properties等这些文件从$CATALINA_HOME/temp/liferay/com/liferay/portal/deploy/dependencies目录

141210984.png

复制到我们用srcFile变量指定的portlet临时目录下的WEB-INF/class目录下。


接下来它会在第522行调用copyTlds(srcFile,pluginPackage)方法:

141650980.png

他们会吧aui.tld,liferay-portlet.tld,liferay-portlet-ext.tld,liferay-security.tld,liferay-theme.tld,liferay-ui.tld,liferay-util.tld这些Taglib定义文件都复制到我们用srcFile变量指定的portlet临时目录下的WEB-INF/tld目录下,那么这些原始文件在哪里呢?也许你猜对了,他们还是在$CATALINA_HOME/temp/liferay/com/liferay/portal/deploy/dependencies 目录下:

142122748.png


接下来它会去调用copyXmls(srcFile,displayName,pluginPackage)方法。

142343706.png

首先它会调用super.copyXmls,这个的作用是用来判断服务器类型来确定如何去复制服务器特定的xml文件和web.xml文件到我们用srcFile变量指定的portlet临时目录下的WEB-INF目录下:

142516561.png

因为我们的appServerType是"tomcat",所以它不会复制服务器特定的xml文件,只会复制一个web.xml。

然后因为我们appServerType是'tomcat",所以它会复制context.xml文件到我们用srcFile变量指定的portlet临时目录下的/META-INF目录下。

最后会吧_servlet_context_include.jsp文件复制到我们用srcFile变量指定的portlet临时目录下的/WEB-INF/jsp目录下.

那么这些xml文件是不是还是在$CATALINA_HOME/temp/liferay/com/liferay/portal/deploy/dependencies 目录下呢?回答正确~

143235472.png


接下来它在第524行调用copyPortalDependencies(srcFile) ,因为我们没有定义plugin package的properties文件,所以这行没执行。


接下来它在第530行调用updateWebXml(webXml,srcFile,displayName,pluginPackage)方法对于我们从$CATALINA_HOME/temp/liferay/com/liferay/portal/deploy/dependencies目录下直接复制来的最原始的xml进行更新,对其中内容进行了增删,(关于这一块也十分复杂, 我准备另外用一文章来介绍)


接下来对于/WEB-INF/ext-lib/global和/WEB-INF/ext-lib/portal中的jar包处理,把他们复制到liferay 服务器上的对应目录,因为我们没有,所以跳过。


接下来在第558行,调用updateDeployDirectory(srcFile)对部署目录进行更新。


然后对于jar包进行排除操作了:

144844676.png

首先,它先判断服务器类型,因为我们是tomcat ,所以它会去吧tomcatLibDir中的所有的jar包都放在排除列表中,这个tomcatLibDir是

145021238.png

然后它会去读取刚才conext.xml,如果其中指定了com.liferay.support.tomcat.loader.PortalClassLoader,那么就去掉3个jar包。


然后把**/WEB-INF/web.xml也加在exclude列表中,因为这web.xml总要被改动的,所以我们这个文件不会最终复制到tomcat下的webapps下我们应用的deployDir中。最终我们的exclude列表如下:

150639723.png


然后第674行执行复制动作,它吧我们的$CATALINA_HOME/temp/<时间戳下>的我们的临时的应用信息去除exclude列表中的web.xml和一些jar文件其他全部复制到$CATALINA_HOME/webapps/<项目名>这个最终部署目录下:

150542896.png


最后第678行单独复制web.xml文件,并且overrite设置为true, 表示覆盖原有的。我们从服务器的所有文件时间戳可以看到这一点,如下:

151334545.png

从上面我们可以看到WEB-INF目录下,只有最后一行的web.xml的时间戳比较上次发生了改变,这就表明这个web.xml是单独复制的,实践果然和代码执行相互吻合。


最后第690行吧这个新生成的web.xml的lastModified设置为当前的时间+6秒。

151643146.png


最最后吧我们吧tempDir(也就是我们在$CATALINA_HOME/temp/<时间戳>)这个目录删除,

151834315.png

就一切大功告成了,从deployDirectory()方法返回。



精华疑点解答:

在总结之前,还有一个疑惑没明白,就是我们看部署的很多动作都是要先从$CATALINA_HOME/liferay/com/liefray/portal/deploy/dependencies目录中吧各种文件(包括properties文件,tld文件,xml文件等)复制到tempDir中,那么这个文件是何时生成的又是为什么包含这么多内容呢?我们现在来专门研究这个问题。

很快就找到了答案,它这些内容从classpath复制到$CATALINA_HOME/temp/liferay 目录下的

154135646.png

而classpath这些文件,经过仔细查找,发现都来自于$CATALINA_HOME/webapps/ROOT/WEB-INF/lib/portal-impl.jar ,比如说所有用到的tld文件:

154438674.png



总结:

(1)deployDirectory的整体作用是在tomcat的temp目录拥有一个从war包展开的目录结构然后经过一些配置,重组,最后复制到webapps下响应应用的部署目录的过程。

(2)首先它会调用rewriteFiles去重写目录下的几个xml文件,目的是让文件更规范,有缩进的格式。

(3)然后它会读取plugin-package.properties中的属性设定到Properties中。

(4)然后调用copyJars()方法吧CATALINA_HOME/liferay/com/liferay/portal/deploy/dependencies目录下的多个jar文件分别复制到我们srcFile指定的portlet临时目录下的WEB-INF/lib目录下。

(5)然后调用copyProperties吧CATALINA_HOME/liferay/com/liferay/portal/deploy/dependencies

目录下的多个properties文件分别复制到我们srcFile指定的portlet临时目录下的WEB-INF/classes目录下.

(6)然后调用copyTlds吧CATALINA_HOME/liferay/com/liferay/portal/deploy/dependencies

目录下的多个tld文件分别复制到我们srcFile指定的portlet临时目录下的WEB-INF/tld目录下.

(7)然后调用copyXmls方法,先根据服务器类型来决定吧服务器特定的xml文件和web.xml文件复制到我们srcFile指定的portlet临时目录下的WEB-INF目录下,如果是tomcat服务器还要复制context.xml文件到portlet临时目录下的META-INF目录下,然后把_servlet_context_include.jsp复制到portlet临时目录下的WEB-INF/jsp目录下。以上文件都是从CATALINA_HOME/liferay/com/liferay/portal/deploy/dependencies目录中获取的。

(8)然后调用updateWebXml(webXml,srcFile,displayName,pluginPackage)方法对于我们从$CATALINA_HOME/temp/liferay/com/liferay/portal/deploy/dependencies目录下直接复制来的最原始的xml进行更新,对其中内容进行了增删(这个放在以后文章中单独讨论)

(9)接下来对于/WEB-INF/ext-lib/global和/WEB-INF/ext-lib/portal中的jar包处理,把他们复制到liferay 服务器上的对应目录

(10)从第(4)-(8)中的每一步复制,这些资源文件都是来自于CATALINA_HOME/liferay/com/liferay/portal/deploy/dependencies 目录,而这些资源文件最初都是来自$CATALINA_HOME/webapps/ROOT/WEB-INF/lib/portal-impl.jar中,这些资源在Liferay运行后会被加载到classpathResource中。

(11)在最终复制到webapps下的部署目录之前,它必须要先生成一个排除列表,表明在复制时候那些资源要先排除,web.xml总是被排除的, 另外还有一些jar文件,取决于我们的配置。

(12)复制到webapps下部署目录的动作总是分为2部分,一是复制除排除列表中的所有文件目录,二是单独复制web.xml文件,所以每次可以看到web.xml的时间戳总比其他文件晚。

(13)最后复制完会到webapps下我们应用的部署目录下把最新的web.xml的lastModified属性往后面调6秒。





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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/392603.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 164. 最大间距(桶排序)

给定一个无序的数组&#xff0c;找出数组在排序之后&#xff0c;相邻元素之间最大的差值。 如果数组元素个数小于 2&#xff0c;则返回 0。 示例 1: 输入: [3,6,9,1] 输出: 3 解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。 示例 2: …

批处理定时mysql备份数据库_定时备份mysql数据库的批处理

定时备份mysql数据库的批处理代码&#xff0c;保存为backup_mysql.bat&#xff0c;运行即可。复制代码 代码如下:echo offset txt1%date:~0,4%::当前年set txt2%date:~5,2%::当前月set txt3%date:~8,2%::当前日set txt4%time:~0,2%::当前小时set txt5%time:~3,2%::当前分钟set …

算法训练营 重编码_您在编码训练营期间可能面临的最大挑战

算法训练营 重编码by Joanna Gaudyn乔安娜高登(Joanna Gaudyn) 您在编码训练营期间可能面临的最大挑战 (The biggest struggles you might face during a coding bootcamp) You think that during a coding bootcamp nothing can be more challenging than learning programmi…

1449 砝码称重(思维)

题目链接&#xff1a;https://www.51nod.com/onlineJudge/submitDetail.html#!judgeId259281 题解&#xff1a;这题有一个技巧&#xff0c;毕竟是w^0,w^1,w^2....这样&#xff0c;必然会想到w进制&#xff0c;而且就只能用一次。 那么就简单了&#xff0c;把m拆成w进制&#xf…

leetcode 454. 四数相加 II(哈希表)

给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) &#xff0c;使得 A[i] B[j] C[k] D[l] 0。 为了使问题简单化&#xff0c;所有的 A, B, C, D 具有相同的长度 N&#xff0c;且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间&#xf…

“换标”Intel的穷则思变

成语有云“穷则思变”&#xff0c;用这个词来形容早先的Intel换标也最恰当不过。当然这里“穷”&#xff0c;不是说Intel很贫穷&#xff0c;而是说Intel在自己的产业到了尽头。Intel推产品概念的水平是一流的&#xff0c;虽然某些概念事后被认为是错误的&#xff08;如&#xf…

mysql开发中遇到的坑_mysql优化过程中遇见的坑(mysql优化问题特别注意)

单条查询最后添加 LIMIT 1&#xff0c;停止全表扫描。对于char(4) 或者vachar(4)&#xff0c;无论是中文还是英文都是存储四个字符&#xff0c;注意是字符而不是字节。如果一个字段未int类型&#xff0c;此类型只有0、1两个状态&#xff0c;需要为此建立索引吗&#xff1f;过度…

初级开发人员的缺点_在您作为初级开发人员的第一年获得此建议

初级开发人员的缺点Are you a junior developer embarking on your software development career?您是从事软件开发事业的初级开发人员吗&#xff1f; Or a recent computer science graduate who has recently started a new job?还是最近刚开始从事新工作的计算机科学专业…

Spark日志分析

根据tomcat日志计算url访问了情况&#xff0c;具体的url如下&#xff0c; 要求&#xff1a;区别统计GET和POST URL访问量 结果为&#xff1a;访问方式、URL、访问量 输入文件&#xff1a; 196.168.2.1 - - [03/Jul/2014:23:36:38 0800] "GET /course/detail/3.htm HTTP/1.…

进程、线程和协程的区别

首先&#xff0c;给出“进程、线程和协程”的特点&#xff1a; 进程&#xff1a;拥有自己独立的堆和栈&#xff0c;既不共享堆&#xff0c;也不共享栈&#xff0c;进程由操作系统调度&#xff1b;线程&#xff1a;拥有自己独立的栈和共享的堆&#xff0c;共享堆&#xff0c;不共…

leetcode 493. 翻转对(分治算法)

给定一个数组 nums &#xff0c;如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。 你需要返回给定数组中的重要翻转对的数量。 示例 1: 输入: [1,3,2,3,1] 输出: 2 代码 class Solution {public int reversePairs(int[] nums) {return getR…

使用brew安装软件

brew 又叫Homebrew&#xff0c;是Mac OSX上的软件包管理工具&#xff0c;能在Mac中方便的安装软件或者卸载软件&#xff0c; 只需要一个命令&#xff0c; 非常方便 brew类似ubuntu系统下的apt-get的功能 阅读目录 安装brew 使用brew安装软件 使用brew卸载软件 使用brew查询软…

mysql 绕过select报错_MySQL注射绕过技巧(三)

在测试一次注入的时候发现过滤了逗号 所以找到这个思路第一次遇到的时候是看key哥挖洞 遇到后就想记录下来正文过滤了逗号 利用join来逐步查询select*from(select 1)a join (select 2)b join (select 3)c;例如下图逐步查询user()user() basediruser() basedir version()也可以…

深入理解javascript

深入理解JavaScript系列&#xff08;1&#xff09;&#xff1a;编写高质量JavaScript代码的基本要点 深入理解JavaScript系列&#xff08;2&#xff09;&#xff1a;揭秘命名函数表达式 深入理解JavaScript系列&#xff08;3&#xff09;&#xff1a;全面解析Module模式 深入理…

spark 并行处理_如何使用Spark集群并行处理大数据

spark 并行处理by Hari Santanam通过Hari Santanam 如何使用Spark集群并行处理大数据 (How to use Spark clusters for parallel processing Big Data) 将Apache Spark的弹性分布式数据集(RDD)与Databricks一起使用 (Use Apache Spark’s Resilient Distributed Dataset (RDD)…

django前后端分离部署

部署静态文件&#xff1a; 静态文件有两种方式1&#xff1a;通过django路由访问2&#xff1a;通过nginx直接访问 方式1&#xff1a; 需要在根目录的URL文件中增加&#xff0c;作为入口 url(r^$, TemplateView.as_view(template_name"index.html")), 在setting中更改静…

Citrix、Microsoft、VMware虚拟桌面之网页接口登录对比

软件环境 Citrix Xendesktop 5.6 Microsoft Windows Server 2008 R2 Hyper-v VMware View client 4.6 首先看citrix的&#xff0c;很早之前Citrix就推出了网页的虚拟桌面和应用程序&#xff0c;默认是单点登录获取桌面 下面是微软的&#xff0c;和citrix很类似&#xff0c; 据我…

leetcode 976. 三角形的最大周长

给定由一些正数&#xff08;代表长度&#xff09;组成的数组 A&#xff0c;返回由其中三个长度组成的、面积不为零的三角形的最大周长。 如果不能形成任何面积不为零的三角形&#xff0c;返回 0。 示例 1&#xff1a; 输入&#xff1a;[2,1,2] 输出&#xff1a;5 示例 2&…

recyclerview 加载fragment_恢复 RecyclerView 的滚动位置

您可能在开发过程中遇到过这种情况&#xff0c;在 Activity/Fragment 被重新创建后&#xff0c;RecyclerView 丢失了它之前保有的滚动位置信息。通常这种情况发生的原因是由于异步加载 Adapter 数据&#xff0c;且数据在 RecyclerView 需要进行布局的时候尚未加载完成&#xff…

4.6.2 软件测试的步骤

系统测试是可有可无的。因为系统测试是和环境结合在一起。系统测试应该是在系统设计或者是需求分析阶段的前一步来完成的。 单元测试它的测试计划是在详细设计阶段完成。所以说单元测试的计划是在详细设计阶段来完成的。 模块接口的测试它保证了测试模块的数据流可以正确地流入…