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,一经查实,立即删除!

相关文章

使用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()也可以…

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; 据我…

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

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

4.6.2 软件测试的步骤

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

栈,递归

栈的基本操作注意&#xff1a;是从后往前连接的 1 #include <stdio.h>2 #include <Windows.h>3 typedef struct sStack4 {5 int num;6 struct sStack* pnext;7 }Stack;8 void push(Stack **pStack,int num);9 int pop(Stack **pStack); 10 BOOL isEmpty(St…

mysql集群多管理节点_项目进阶 之 集群环境搭建(三)多管理节点MySQL集群

多管理节点MySQL的配置很easy&#xff0c;仅须要改动之前的博文中提高的三种节点的三个地方。1)改动管理节点配置打开管理节点C:\mysql\bin下的config.ini文件&#xff0c;将当中ndb_mgmd的相关配置改动为例如以下内容&#xff1a;[ndb_mgmd]# Management process options:# Ho…

APK伪加密

一、伪加密技术原理 我们知道android apk本质上是zip格式的压缩包&#xff0c;我们将android应用程序的后缀.apk改为.zip就可以用解压软件轻松的将android应用程序解压缩。在日常生活或者工作中&#xff0c;我们通常为了保护我们自己的文件在进行压缩式都会进行加密处理。这样的…

乱花渐欲迷人眼-杜绝设计的视噪

视噪&#xff0c;又称视觉噪音。我们每天接受来自外界的大量信息&#xff0c;这些信息有将近70&#xff05;是通过视觉感知获得的。视噪会干扰我们对信息的判断&#xff0c;影响到产品的易用性和可用性&#xff0c;与用户体验的好坏息息相关。(克劳德香农图演示了噪音如何影响信…

超详细windows安装mongo数据库、注册为服务并添加环境变量

1.官网下载zip安装包 官网地址https://www.mongodb.com/download-center/community?jmpnav&#xff0c;现在windows系统一般都是64位的&#xff0c;选好版本、系统和包类型之后点击download&#xff0c;mongodb-win32-x86_64-2008plus-ssl-4.0.10.zip。 2.解压zip包&#xff0…

.netcore mysql_.netcore基于mysql的codefirst

.netcore基于mysql的codefirst此文仅是对于netcore基于mysql的简单的codefirst实现的简单记录。示例为客服系统消息模板的增删改查实现第一步、创建实体项目&#xff0c;并在其中建立对应的实体类&#xff0c;以及数据库访问类须引入Pomelo.EntityFrameworkCore.MySql和Microso…

android 涨潮动画加载_Android附带涨潮动画效果的曲线报表绘制

写在前面本文属于部分原创&#xff0c;实现安卓平台正弦曲线类报表绘制功能介绍&#xff0c;基于网络已有的曲线报表绘制类(LineGraphicView)自己添加了涨潮的渐变动画算法最终效果图废话少说&#xff0c;直接上源码一、自定义View LineGraphicView&#xff0c;本类注释不算多&…

Oracle Study之--Oracle等待事件(5)

Db file single write这个等待事件通常只发生在一种情况下&#xff0c;就是Oracle 更新数据文件头信息时&#xff08;比如发生Checkpoint&#xff09;。当这个等待事件很明显时&#xff0c;需要考虑是不是数据库中的数据文件数量太大&#xff0c;导致Oracle 需要花较长的时间来…

Java多线程-工具篇-BlockingQueue

Java多线程-工具篇-BlockingQueue 转载 http://www.cnblogs.com/jackyuj/archive/2010/11/24/1886553.html 这也是我们在多线程环境下&#xff0c;为什么需要BlockingQueue的原因。作为BlockingQueue的使用者&#xff0c;我们再也不需要关心什么时候需要阻塞线程&#xff0c;什…

怎么连接 mysql_怎样连接连接数据库

这个博客是为了说明怎么连接数据库第一步&#xff1a;肯定是要下载数据库&#xff0c;本人用的SqlServer2008&#xff0c;是从别人的U盘中拷来的。第二步&#xff1a;数据库的登录方式设置为混合登录&#xff0c;步骤如下&#xff1a;1.打开数据库这是数据库界面&#xff0c;要…

webstorm环境安装配置(less+autoprefixer)

node安装&#xff1a; 参考地址&#xff1a;http://www.runoob.com/nodejs/nodejs-install-setup.html 1.下载node安装包并完成安装 2.在开始菜单打开node 3.查看是否安装完成&#xff08;npm是node自带安装的&#xff09; 命令&#xff1a;node -v npm -v less安装&#xff1a…

如何解决ajax跨域问题(转)

由 于此前很少写前端的代码(哈哈&#xff0c;不合格的程序员啊)&#xff0c;最近项目中用到json作为系统间交互的手段&#xff0c;自然就伴随着众多ajax请求&#xff0c;随之而来的就是要解决 ajax的跨域问题。本篇将讲述一个小白从遇到跨域不知道是跨域问题&#xff0c;到知道…

判断输入的字符串是否为回文_刷题之路(九)--判断数字是否回文

Palindrome Number问题简介&#xff1a;判断输入数字是否是回文,不是返回0,负数返回0举例:1:输入: 121输出: true2:输入: -121输出: false解释: 回文为121-&#xff0c;所以负数都不符合3:输入: 10输出: false解释: 倒序为01&#xff0c;不符合要求解法一&#xff1a;这道题比较…

VirtualBox 虚拟机复制

本文简单讲两种情况下的复制方式 1 跨电脑复制 2 同一virtrul box下 虚拟机复制 ---------------------------------------------- 1 跨电脑复制 a虚拟机 是老的虚拟机 b虚拟机 是新的虚拟机 新虚拟机b 新建&#xff0c; 点击下一步会生成 相应的文件夹 找到老虚拟机a的 vdi 文…

mysql case快捷方法_MySQL case when使用方法实例解析

首先我们创建数据库表&#xff1a; CREATE TABLE t_demo (id int(32) NOT NULL,name varchar(255) DEFAULT NULL,age int(2) DEFAULT NULL,num int(3) DEFAULT NULL,PRIMARY KEY (id)) ENGINEInnoDB DEFAULT CHARSETutf8;插入数据&#xff1a;INSERT INTO t_demo VALUES (1, 张…