Maven中如何配置WAR依賴WAR和JAR的多模塊項目結構

From:http://depravedangel.iteye.com/blog/1450964javascript

先考慮以下實際狀況:java

  1. war項目C和war項目B都依賴war項目A和JAR項目X. 項目A中保存了B和C項目通用的web資源,好比通用的javascript,CSS,jsp等. 項目X中保存了B和C項目中都依賴的一些class
  2. 開發人員但願每次都只面對一個項目,即Team A 開發項目A, Team B開發項目B, Team C開發項目C....以此類推
  3. 每一個Team在開發本身項目時,都但願能直接進行調試,例如war項目A能夠直接部署到TOMCAT上運行測試
  4. 最後實際交付給客戶的卻只有2個項目: B和C .也就是說,最後要打包B和C,而在B和C的war包中都要包含A中的web資源和X中的class

在純Maven中的實現方案

純MAVEN環境比較簡單,通過一段曲折(先是修改maven-war-plguin源碼,再是自定義一個插件),最後發現竟然有一個現成的插件能夠實現這個功能,示範以下:web

<dependency>
   <groupId>com.isoftstone.gads</groupId>
   <artifactId>common-web</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <type>war</type>
</dependency>
<dependency>
   <groupId>com.isoftstone.gads</groupId>
   <artifactId>common-web</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <type>warpath</type>
</dependency>sql

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1-beta-1</version>
    <configuration>
     <!- 必須指定,不然默認會變成在target/war/work 致使被打包進war文件,指定後爲target/work ->
     <workDirectory>${project.build.directory}/work</workDirectory>
     <webappDirectory>WebContent</webappDirectory>
     <useCache>false</useCache>
     <archive>
      <addMavenDescriptor>true</addMavenDescriptor>
     </archive>
     <overlays>
      <overlay>
       <groupId>com.isoftstone.gads</groupId>
       <artifactId>ebiz-common-web</artifactId>
      </overlay>
      <overlay>
       <!-- empty groupId/artifactId is detected as the current build -->
       <!-- 表明當前WAR項目,默認狀況下當前WAR項目是先被拷貝的,若是要控制其順序,則使用空的overlay -->
       <!-- any other overlay will be applied after the current build since they have not been configured in the overlays
        element -->
      </overlay>
     </overlays>
     <dependentWarExcludes>*/web.xml,WEB-INF/lib/*,/sql-map-config.xml,/jdbc.properties,/META-INF/*</dependentWarExcludes>
    </configuration>
   </plugin>apache

<plugin>
    <groupId>org.appfuse.plugins</groupId>
    <artifactId>maven-warpath-plugin</artifactId>
    <version>2.1.0-M1</version>
    <extensions>true</extensions>
    <executions>
     <execution>
      <goals>
       <goal>add-classes</goal>
      </goals>
     </execution>
    </executions>
    <configuration><!-- below WEB-INF/classes -->
     <warpathExcludes>**/logback-test.xml</warpathExcludes>
    </configuration>
</plugin>app

注意紅色部分,說明以下:eclipse

  1. 首先是使用了maven-warpath-plugin插件,處理全部<type>warpath</type>的artifact,這個插件能夠將從依賴的WAR中傳遞的依賴都打包到當前的WAR中,沒有這個插件時,當前WAR從所依賴的WAR artifact那所傳遞來的依賴在打包成WAR時都會被忽略.既然如今能將傳遞的依賴打包了,就不用copy依賴的war中的WEB-INF/lib/*,因此被加入到<dependentWarExcludes>中
  2. <workDirectory>的設置看我寫的註釋
  3. webappDirectory的指定須要額外注意.首先,我使用了MAVEN默認的資源路徑,也就是 src/main/webapp,而這裏卻告訴maven-war-plugin另外一個路徑"WebContent",產生的結果就是,執行mvn package時,war-plugin和warpath-plugin會將當前war和全部依賴的war的web資源都拷貝到WebContent目錄下.這樣,WebContent目錄包含的內容就是最終打包成WAR的內容了.

在eclipse集成了Maven插件時的實現方案

純MAVEN確實很happy,可是咱們開發項目但是要在eclipse中進行的,安裝了M2E插件後 ,如何利用eclipse的WTP提供的SERVER功能進行快速的部署調式,是個須要解決的問題.webapp

  1. 在eclipse的配置文件".settings/.jsdtscope"修改<classpathentry kind="src" path="src/main/webapp"/>爲<classpathentry kind="src" path="WebContent"/>
  2. 在".settings/org.eclipse.wst.common.component"中把<wb-resource deploy-path="/" source-path="/src/main/webapp"/>修改<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/webapp"/>,並增長<wb-resource deploy-path="/" source-path="/WebContent"/>
  3. OK,通過上述配置後,eclipse就把/WebContent目錄認爲web資源根路徑了.這樣在eclipse的Servers View中,把這個war項目增長到TOMCAT上時,實際部署的就是/WebContent ,能夠直接在eclipse部署運行這個war項目了
  4. 可是....實現了能夠在eclipse上直接部署的功能後,我發現喪失了eclipse的文件變化監視功能.好比,本來在eclipse中修改一個jsp後,就能夠自動同步到TOMCAT上,但如今我實際的web資源路徑是src/main/webapp, 而eclipse識別的web資源路徑倒是WebConten.個人文件修改都是在src/main/webapp,不執行mvn package是不會同步到WebContent中,eclipse也就不會把我修改的JSP同步到TOMCAT上.爲了解決這個問題,我自定義了一個插件,示例以下:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-websources-plugin</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <executions>
     <execution>
      <goals>
       <goal>webSources</goal>
      </goals>
     </execution>
    </executions>
</plugin>jsp

   這個插件綁定了@phase process-resources,因此在src/main/webapp下的文件有變化時,會自動被調用,將src/main/webapp下有變化的文件拷貝到WebContent目錄下.這時就會被eclipse發現這個變化,從而同步到TOMCAT上.maven

相關文章
相關標籤/搜索