Maven的overlay外掛的用法【結合cas4.0.3】
overlay外掛是使用者多個web專案的war包合併,被依賴的war包會根據pom中的配置以及主專案的現有檔案進行合併。用途:1.大型web專案的並行開發。在分散式的趨勢下,這個用途應該不多了。2.基於他人專案的修改,比如:cas本身用來做登陸許可權的中央認證,其中專案原始碼非常之多,但本身必須是一個持續執行在伺服器上的web專案,對於開發者而言只是需要在cas程式碼上根據業務做一些修改,涉及到的檔案可能只有三四個,而其他多餘的東西完全用不到,這就會導致專案看起來十分累贅、冗餘。時間一久也忘了幾十上百個檔案中到底修改了那些。
而使用overlay外掛的好處在於:1.專案看起來更加清爽。2.因為專案中的已有的檔案就是自己定義的檔案,即使是後面接手的人,也一目瞭然、便於維護。3.提高開發效率,若用傳統方式需要提取所以檔案到專案,一旦漏掉哪個就會導致報錯,編寫程式碼也不會因為程式碼檔案太多太龐大,導致編譯工具卡頓,最終執行的版本會在專案執行時先合併再編譯執行。
以cas4.0.3為例,左邊傳統方式,右邊使用overlay外掛
可以看出專案立即變得清爽,需要自定義什麼內容,只需要在專案中建立對應目錄結構下的同名檔案即可。
overlay外掛的用法
1.首先建立一個乾淨清爽的maven webapp專案
2.開啟pom檔案加入overlay的外掛
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
< version>3.2.2</version>
<configuration>
<overlays>
<overlay>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-webapp</artifactId>
</overlay>
</overlays>
</ configuration>
</plugin>
其中<overlays>
標籤下可以加入多個<overlay>
也就是支援多個war包的合併,填寫時只需寫入<groupId>
和<artifactId>
不需要版本號。
3.將overlay
裡面的war包依賴加入到dependencies
中:
dependency>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-webapp</artifactId>
<version>4.0.3</version>
<type>war</type>
<!--<scope>runtime</scope>-->
</dependency>
scope
寫不寫都一樣,因為在編寫程式碼時候,獲取不到war中的jar包依賴。
4.此時專案中會多一個overlay的檔案:
需要修改什麼內容,則參照overlay裡面的結構去建立同樣的目錄和檔案即可,這裡需要將overlay裡面的web.xml檔案複製到主專案中,因為合併後的內容都是以主專案的檔案為準,而web.xml是整個webapp的核心配置檔案,因此在無法被覆蓋的前提下,要保證主專案的web.xml包含了所有overlay專案中的web.xml的啟動配置環境,如各種filter和spring的配置檔案的掃描路徑是通用的
5.將web.xml提取到主專案中替換後,即可直接在tomcat中啟動起來
同時關注到專案執行時,生成的target檔案:
發現overlay
下面的檔案都最終合併在主專案中。
6.自定義一個登陸介面
cas4.0中直接替換WEB-INF/view/jsp/default/ui/casLoginView.jsp
即可完成對登陸介面的修改。
先建立一個同目錄下的同名檔案:
然後啟動專案測試:
發現介面直接變成了自定義的,同時觀察生成的target檔案:
發現此時的casLoginView.jsp
自動變成了自定義的。
7.includes
與excludes
的用法
開啟生成的target檔案:
發現unused-spring-configuration檔案下的東西完全不需要的,此時在pom的<overlay>
下做如下修改:
<overlays>
<overlay>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-webapp</artifactId>
<excludes>
<exclude>WEB-INF/unused-spring-configuration/**</exclude>
</excludes>
</overlay>
</overlays>
然後將target刪除後,再啟動專案:
發現被exclude
匹配的檔案直接消失。
總結:<overlay>
下的<exclude>
下匹配的檔案不會出現在最終合併target中,也就是啟動環境中去。這個可以用於一些主專案用不到的資原始檔可以用exclude
直接移除掉。
那麼對應的include
則代表只將include
中匹配的檔案合併到主專案中去。同樣的來做個測試:
- 這次只加載overlay中的jsp進來:
pom:
<overlay>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-webapp</artifactId>
<includes>
<include>WEB-INF/view/jsp/**</include>
</includes>
</overlay>
- 刪除target檔案,執行後發現:
這次只有jsp檔案被合併了進來。
總結:<overlay>
下若有<include>
的配置,則最終合併的檔案只包含include下匹配的檔案
include用於讓開發者去靈活選擇overlay中只需要用到的資源。
8.dependentWarIncludes
與dependentWarExcludes
這兩個和include
與exclude
用法一致,前者配置只合並的檔案,後者配置不合並的檔案。那麼和include
與exclude
的區別是啥呢?
先看pom用法:
<configuration>
<overlays>
<overlay>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-webapp</artifactId>
<includes>
<include>WEB-INF/view/jsp/**</include>
</includes>
</overlay>
</overlays>
<!--<dependentWarIncludes>WEB-INF/web.xml</dependentWarIncludes>-->
<dependentWarIncludes>WEB-INF/**</dependentWarIncludes>
<dependentWarExcludes>WEB-INF/view/jsp/default/ui/casLogoutView.jsp</dependentWarExcludes>
</configuration>
可以看到用法是直接寫在configuration
節點下,也就是說,這個配置對所有overlay
都起作用,前提是<overlay>
下沒有<include>
與<exclude>
,也就是說<dependentWarIncludes>
和<dependentWarExcludes>
是全域性作用,每個<overlay>
下的war包都會被應用到該配置,但是優先順序要低於<include>
與<exclude>
。