引入:

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

调试分析:

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

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

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

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

后面3个参数不用说了。

我们开始分析:

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

代码我不贴了,一看就懂,它的目的是对于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) 方法,

他们会吧$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)方法。

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

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

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

他们会吧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 目录下:

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

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

因为我们的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 目录下呢?回答正确~

接下来它在第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包进行排除操作了:

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

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

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

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

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

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

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

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

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

精华疑点解答:

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

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

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

总结:

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

Liferay 部署war包时候的deployDirectory 细节分析相关推荐

  1. linux 解压war到root_部署War包到Tomcat根目录位置(Ubuntu/CentOS)

    操作系统:CentOS 5.6 对于ubuntu 14.04来说,Tomcat的war包默认目录路径位置在 /var/lib/tomcat7/webapps 对于ubuntu 18.04来说,Tomc ...

  2. Jboss7或者wildfly部署war包的问题

    如果在Jboss7或者wildfly中部署war包是遇到类似如下错误: "{"JBAS014671: Failed services" => {"jbos ...

  3. 史上最详细阿里云服务器上Docker部署War包项目 实战每一步都带详细图解!!!

    史上最详细阿里云服务器上Docker部署War包项目 实战每一步都带详细图解!!! 部署jar 包方式: https://blog.csdn.net/weixin_45821811/article/d ...

  4. 部署WAR包实时查看Tomcat的状态和日志

    在不重启Tomcat的情况下部署WAR包实时输出日志的方法: 注意:以下方式只适合Linux. 一.定位错误 查看Tomcat日志的尾部 tail -n 50 /opt/tomcat8/logs/ca ...

  5. python3 自动打包部署war包

    2019独角兽企业重金招聘Python工程师标准>>> 1 调用maven 命令打包 mvn -B -f D:/workspace/ksdcourse clean package 2 ...

  6. linux系统部署war包,查看tomcat日志

    1.部署war包 app/tomcat/bin 在tomcat/bin 目录下启动 .startup.sh,在启动过程中tomcat会对war包进行解压,形成相应的项目目录 执行命令: ./start ...

  7. Weblogic Server上部署War包

    利用各种IDE工具,将项目打成War包(当然,也可以直接在IDE中将服务器配置成Weblogic Server),部署到 Weblogic上,有多种方法:   1.利用Console控制台:      ...

  8. (转)用 Maven 部署 war 包到远程 Tomcat 服务器

    转自蒋国纲 www.cnblogs.com/guogangj/p/5505228.html 用Maven部署war包到远程Tomcat服务器 过去我们发布一个Java Web程序通常的做法就是把它打成 ...

  9. 部署war包后,新增tomcat服务器,启动tomcat服务器报错解决方法

    部署war包后,新增tomcat服务器,启动tomcat服务器报错解决方法 参考文章: (1)部署war包后,新增tomcat服务器,启动tomcat服务器报错解决方法 (2)https://www. ...

最新文章

  1. C++中struct的使用
  2. form表单只提交数据而不进行页面跳转的解决方案
  3. 容易忽视但是功能灰常强大的Java API(五. 二分查找)
  4. 实现一个通用的生产者消费者队列(c语言版本)
  5. python读取坐标文本文件_Python 实现文件读写、坐标寻址、查找替换功能
  6. 删除服务中的mysql服务
  7. 深度学习的实用层面 —— 1.2 偏差/方差
  8. 苹果宣布对2019款iPad降价:最高降幅达500元
  9. 卫星协同观测的学习笔记
  10. [争什么! 掺在一起做撒尿牛丸啊! 笨蛋]ASP.NET Core 2.0 + EF6 + Linux +MySql混搭
  11. python调用按键精灵插件_按键精灵必须掌握的命令之插件命令
  12. 中国联通517活动-沃福卡-技术分解实现方案
  13. html实现pdf导出excel表格,纯前端文件导出-Excel/PDF
  14. 美团面试小感——认知撑起的格局
  15. 正向最大匹配、逆向最大匹配与双向匹配算法实现
  16. 公安大数据平台应用与公安大数据建模
  17. CC00051.elasticsearch——|HadoopElasticSearch.V03|——|ELK.v03Logstash部署.V3|
  18. C语言简介及进制换算
  19. 曝英伟达将新发低功耗RTX 3050显卡
  20. 《Serverless 与容器决战在即?有了弹性伸缩就不一样了》

热门文章

  1. PyCharm安装及配置
  2. 关闭浏览器 清空session_跨境网络小知识之Session
  3. C++11 std::shared_ptr的std::move()移动语义底层分析
  4. AAC ADTS格式分析
  5. 兰州交通大学C语言课程设计,兰州交通大学C语言课程设计报告(完整版).doc
  6. mysql 学习笔记03 常用数据类型
  7. 装配组件_基于Haption力反馈系统的交互式装配仿真
  8. sun键盘没有stop键_请教Sun键盘
  9. 一个通用纯C队列的实现
  10. 我三年开发经验,从字节跳动抖音离职后,看看这篇文章吧!