1. 程式人生 > >Maven的overlay外掛的用法【結合cas4.0.3】

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.includesexcludes的用法
開啟生成的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.dependentWarIncludesdependentWarExcludes這兩個和includeexclude用法一致,前者配置只合並的檔案,後者配置不合並的檔案。那麼和includeexclude的區別是啥呢?
    先看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>