日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/11/29 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Liferay 部署war包时候的deployDirectory 细节分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

引入:

在上文中,我們從宏觀上講解了Liferay部署war包的動(dòng)作是如何觸發(fā)監(jiān)聽器并且完成部署過程的,但是其中最核心的一塊deployDirectory我們沒講,它的作用是當(dāng)有了臨時(shí)目錄并且已經(jīng)把war包的內(nèi)容展開到該目錄之后,是如何對(duì)其中內(nèi)容進(jìn)行解析,再加工并且最終復(fù)制到最終的部署目錄deployDir的,我們這里就研究這塊內(nèi)容:


調(diào)試分析:

首先,我們看下這個(gè)復(fù)雜方法的入?yún)?#xff1a;


srcFile參數(shù)是我們臨時(shí)目錄,也就是被展開的war文件對(duì)應(yīng)的目錄。

mergeDir是一個(gè)目錄,用于merge的,我們?cè)O(shè)置為在LIFERAY部署目錄($LIFERAY_HOME/deploy)中建一個(gè)merge目錄,然后以我們的war包名字為子目錄,如下:

deployDir不用說了, 也就是在tomcat的webapps目錄下我們的應(yīng)用最終要放置到的目錄:

后面3個(gè)參數(shù)不用說了。


我們開始分析:

首先在第514行調(diào)用rewriteFiles去重寫臨時(shí)目錄中srcDir中的幾個(gè)文件:

代碼我不貼了,一看就懂,它的目的是對(duì)于web.xml, liferay-plugin-package.xml,liferay-display.xml,liferay-portlet.xml,portlet.xml這5個(gè)文件進(jìn)行子元素的縮進(jìn),并且縮進(jìn)量都是一個(gè)制表符的距離。所以最終文件都會(huì)變成:

<parent-ele>

? ? ? ?<child-ele>

這種縮進(jìn)格式


接著在第516行中調(diào)用mergeDirectory(mergeDir,srcFile)方法,.因?yàn)槲覀兊膍ergeDir為空,所以直接這段代碼跳過。


接著在第518行調(diào)用processPluginPackageProperties(srcFile,displayName,pluginPackage)對(duì)于plugin package的properties文件進(jìn)行處理,因?yàn)槲覀儧]有l(wèi)iferay-plugin-package.properties,取而代之我們是用xml文件的,所以這段代碼也跳過。


接著會(huì)在第520行調(diào)用copyJars(srcDir,pluginPackage) 方法,

他們會(huì)吧$CATALINA_HOME/liferay/com/liferay/portal/deploy/dependencies目錄下的多個(gè)jar文件

分別復(fù)制到我們srcFile指定的portlet臨時(shí)目錄下的WEB-INF/lib目錄下。

細(xì)心的你一定會(huì)問,為什么突然多出來$CATALINA_HOME/liferay/com/liefray/portal/deploy/dependencies目錄,為什么會(huì)有這么多jar文件?其實(shí)我也不知道,我們?cè)谧詈蟆熬A疑點(diǎn)解答中”會(huì)分析,這里姑且假定這個(gè)目錄已經(jīng)存在并且由這些jar文件吧。


然后在第521行調(diào)用copyProperties(srcFile,pluginPackage)方法。

細(xì)節(jié)我省去了,它會(huì)去吧logging.properties,log4j.properties,service.properties等這些文件從$CATALINA_HOME/temp/liferay/com/liferay/portal/deploy/dependencies目錄

復(fù)制到我們用srcFile變量指定的portlet臨時(shí)目錄下的WEB-INF/class目錄下。


接下來它會(huì)在第522行調(diào)用copyTlds(srcFile,pluginPackage)方法:

他們會(huì)吧aui.tld,liferay-portlet.tld,liferay-portlet-ext.tld,liferay-security.tld,liferay-theme.tld,liferay-ui.tld,liferay-util.tld這些Taglib定義文件都復(fù)制到我們用srcFile變量指定的portlet臨時(shí)目錄下的WEB-INF/tld目錄下,那么這些原始文件在哪里呢?也許你猜對(duì)了,他們還是在$CATALINA_HOME/temp/liferay/com/liferay/portal/deploy/dependencies 目錄下:


接下來它會(huì)去調(diào)用copyXmls(srcFile,displayName,pluginPackage)方法。

首先它會(huì)調(diào)用super.copyXmls,這個(gè)的作用是用來判斷服務(wù)器類型來確定如何去復(fù)制服務(wù)器特定的xml文件和web.xml文件到我們用srcFile變量指定的portlet臨時(shí)目錄下的WEB-INF目錄下:

因?yàn)槲覀兊腶ppServerType是"tomcat",所以它不會(huì)復(fù)制服務(wù)器特定的xml文件,只會(huì)復(fù)制一個(gè)web.xml。

然后因?yàn)槲覀僡ppServerType是'tomcat",所以它會(huì)復(fù)制context.xml文件到我們用srcFile變量指定的portlet臨時(shí)目錄下的/META-INF目錄下。

最后會(huì)吧_servlet_context_include.jsp文件復(fù)制到我們用srcFile變量指定的portlet臨時(shí)目錄下的/WEB-INF/jsp目錄下.

那么這些xml文件是不是還是在$CATALINA_HOME/temp/liferay/com/liferay/portal/deploy/dependencies 目錄下呢?回答正確~


接下來它在第524行調(diào)用copyPortalDependencies(srcFile) ,因?yàn)槲覀儧]有定義plugin package的properties文件,所以這行沒執(zhí)行。


接下來它在第530行調(diào)用updateWebXml(webXml,srcFile,displayName,pluginPackage)方法對(duì)于我們從$CATALINA_HOME/temp/liferay/com/liferay/portal/deploy/dependencies目錄下直接復(fù)制來的最原始的xml進(jìn)行更新,對(duì)其中內(nèi)容進(jìn)行了增刪,(關(guān)于這一塊也十分復(fù)雜, 我準(zhǔn)備另外用一文章來介紹)


接下來對(duì)于/WEB-INF/ext-lib/global和/WEB-INF/ext-lib/portal中的jar包處理,把他們復(fù)制到liferay 服務(wù)器上的對(duì)應(yīng)目錄,因?yàn)槲覀儧]有,所以跳過。


接下來在第558行,調(diào)用updateDeployDirectory(srcFile)對(duì)部署目錄進(jìn)行更新。


然后對(duì)于jar包進(jìn)行排除操作了:

首先,它先判斷服務(wù)器類型,因?yàn)槲覀兪莟omcat ,所以它會(huì)去吧tomcatLibDir中的所有的jar包都放在排除列表中,這個(gè)tomcatLibDir是

然后它會(huì)去讀取剛才conext.xml,如果其中指定了com.liferay.support.tomcat.loader.PortalClassLoader,那么就去掉3個(gè)jar包。


然后把**/WEB-INF/web.xml也加在exclude列表中,因?yàn)檫@web.xml總要被改動(dòng)的,所以我們這個(gè)文件不會(huì)最終復(fù)制到tomcat下的webapps下我們應(yīng)用的deployDir中。最終我們的exclude列表如下:


然后第674行執(zhí)行復(fù)制動(dòng)作,它吧我們的$CATALINA_HOME/temp/<時(shí)間戳下>的我們的臨時(shí)的應(yīng)用信息去除exclude列表中的web.xml和一些jar文件其他全部復(fù)制到$CATALINA_HOME/webapps/<項(xiàng)目名>這個(gè)最終部署目錄下:


最后第678行單獨(dú)復(fù)制web.xml文件,并且overrite設(shè)置為true, 表示覆蓋原有的。我們從服務(wù)器的所有文件時(shí)間戳可以看到這一點(diǎn),如下:

從上面我們可以看到WEB-INF目錄下,只有最后一行的web.xml的時(shí)間戳比較上次發(fā)生了改變,這就表明這個(gè)web.xml是單獨(dú)復(fù)制的,實(shí)踐果然和代碼執(zhí)行相互吻合。


最后第690行吧這個(gè)新生成的web.xml的lastModified設(shè)置為當(dāng)前的時(shí)間+6秒。


最最后吧我們吧tempDir(也就是我們?cè)?CATALINA_HOME/temp/<時(shí)間戳>)這個(gè)目錄刪除,

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



精華疑點(diǎn)解答:

在總結(jié)之前,還有一個(gè)疑惑沒明白,就是我們看部署的很多動(dòng)作都是要先從$CATALINA_HOME/liferay/com/liefray/portal/deploy/dependencies目錄中吧各種文件(包括properties文件,tld文件,xml文件等)復(fù)制到tempDir中,那么這個(gè)文件是何時(shí)生成的又是為什么包含這么多內(nèi)容呢?我們現(xiàn)在來專門研究這個(gè)問題。

很快就找到了答案,它這些內(nèi)容從classpath復(fù)制到$CATALINA_HOME/temp/liferay 目錄下的

而classpath這些文件,經(jīng)過仔細(xì)查找,發(fā)現(xiàn)都來自于$CATALINA_HOME/webapps/ROOT/WEB-INF/lib/portal-impl.jar ,比如說所有用到的tld文件:



總結(jié):

(1)deployDirectory的整體作用是在tomcat的temp目錄擁有一個(gè)從war包展開的目錄結(jié)構(gòu)然后經(jīng)過一些配置,重組,最后復(fù)制到webapps下響應(yīng)應(yīng)用的部署目錄的過程。

(2)首先它會(huì)調(diào)用rewriteFiles去重寫目錄下的幾個(gè)xml文件,目的是讓文件更規(guī)范,有縮進(jìn)的格式。

(3)然后它會(huì)讀取plugin-package.properties中的屬性設(shè)定到Properties中。

(4)然后調(diào)用copyJars()方法吧CATALINA_HOME/liferay/com/liferay/portal/deploy/dependencies目錄下的多個(gè)jar文件分別復(fù)制到我們srcFile指定的portlet臨時(shí)目錄下的WEB-INF/lib目錄下。

(5)然后調(diào)用copyProperties吧CATALINA_HOME/liferay/com/liferay/portal/deploy/dependencies

目錄下的多個(gè)properties文件分別復(fù)制到我們srcFile指定的portlet臨時(shí)目錄下的WEB-INF/classes目錄下.

(6)然后調(diào)用copyTlds吧CATALINA_HOME/liferay/com/liferay/portal/deploy/dependencies

目錄下的多個(gè)tld文件分別復(fù)制到我們srcFile指定的portlet臨時(shí)目錄下的WEB-INF/tld目錄下.

(7)然后調(diào)用copyXmls方法,先根據(jù)服務(wù)器類型來決定吧服務(wù)器特定的xml文件和web.xml文件復(fù)制到我們srcFile指定的portlet臨時(shí)目錄下的WEB-INF目錄下,如果是tomcat服務(wù)器還要復(fù)制context.xml文件到portlet臨時(shí)目錄下的META-INF目錄下,然后把_servlet_context_include.jsp復(fù)制到portlet臨時(shí)目錄下的WEB-INF/jsp目錄下。以上文件都是從CATALINA_HOME/liferay/com/liferay/portal/deploy/dependencies目錄中獲取的。

(8)然后調(diào)用updateWebXml(webXml,srcFile,displayName,pluginPackage)方法對(duì)于我們從$CATALINA_HOME/temp/liferay/com/liferay/portal/deploy/dependencies目錄下直接復(fù)制來的最原始的xml進(jìn)行更新,對(duì)其中內(nèi)容進(jìn)行了增刪(這個(gè)放在以后文章中單獨(dú)討論)

(9)接下來對(duì)于/WEB-INF/ext-lib/global和/WEB-INF/ext-lib/portal中的jar包處理,把他們復(fù)制到liferay 服務(wù)器上的對(duì)應(yīng)目錄

(10)從第(4)-(8)中的每一步復(fù)制,這些資源文件都是來自于CATALINA_HOME/liferay/com/liferay/portal/deploy/dependencies 目錄,而這些資源文件最初都是來自$CATALINA_HOME/webapps/ROOT/WEB-INF/lib/portal-impl.jar中,這些資源在Liferay運(yùn)行后會(huì)被加載到classpathResource中。

(11)在最終復(fù)制到webapps下的部署目錄之前,它必須要先生成一個(gè)排除列表,表明在復(fù)制時(shí)候那些資源要先排除,web.xml總是被排除的, 另外還有一些jar文件,取決于我們的配置。

(12)復(fù)制到webapps下部署目錄的動(dòng)作總是分為2部分,一是復(fù)制除排除列表中的所有文件目錄,二是單獨(dú)復(fù)制web.xml文件,所以每次可以看到web.xml的時(shí)間戳總比其他文件晚。

(13)最后復(fù)制完會(huì)到webapps下我們應(yīng)用的部署目錄下把最新的web.xml的lastModified屬性往后面調(diào)6秒。





本文轉(zhuǎn)自 charles_wang888 51CTO博客,原文鏈接:http://blog.51cto.com/supercharles888/1286631,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者

總結(jié)

以上是生活随笔為你收集整理的Liferay 部署war包时候的deployDirectory 细节分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。