Liferay 部署war包时候的deployDirectory 细节分析
引入:
在上文中,我們從宏觀上講解了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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 晚上梦到猫预示着什么
- 下一篇: “换标”Intel的穷则思变