2012-05-31 16 views
7

戰爭疊加里面修改資源我有這個當前設置:在行家

項目A輸出war文件 - 有一個配置文件(WEB-INF/web.xml中)。我們一直在提供這個配置的註釋部分,當項目部署在特定環境中時,該配置會手動取消註釋。

項目的需求已經改變 - 我需要項目A完全沒有配置部分的內容;我需要另一個項目(項目B)與該部分的配置(啓用,未註釋掉)一起構建。

而不是讓這個文件存在於兩個項目中(雙重維護),我希望我可以讓項目B依賴項目A(通過戰爭覆蓋),然後使用maven-config-processor-plugin添加我的特殊配置到WEB-INF/web.xml,然後重新打包war文件。

這似乎並不奏效 - 雖然 - 如果目標已經存在(即在上一次運行之後),配置修改可以工作,但是當我將所有東西一起運行時,疊加並重新打包成新的戰爭發生在一起 - 而我無法想出任何方式讓配置處理器插件在中間運行。基本上,默認順序最終是「config-processor」(因爲overlay還沒有發生而失敗),然後是「war」(全部作爲一個單元)。在疊加之後但戰爭完全打包之前,我無法讓配置處理器發生。

在過去的幾年中,互聯網上的多人問過,如果有一種方法在「解壓疊加」和「重新打包war文件」步驟之間插入插件,但沒有人明確地回答了這個問題辦法。有任何想法嗎?

回答

5

由於戰爭疊加和戰爭包裝似乎都是作爲單一目標的一部分發生的,我不認爲有辦法擺脫它。作爲一種解決方法,您可以在早期階段提取web.xml並對其進行處理。 maven-dependency-plugin可以用於項目B從項目A中提取web.xml到一個工作目錄,然後在web.xml上運行maven-config-processor-plugin並將結果放在其他地方,然後指示maven-war-plugin包含在重疊之前處理web.xml。在項目B的POM:

<plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-dependency-plugin</artifactId> 
     <version>2.4</version> 
     <executions> 
      <!-- Extract web.xml from Project A --> 
      <execution> 
       <id>unpack-webxml</id> 
       <phase>generate-resources</phase> 
       <goals> 
        <goal>unpack</goal> 
       </goals> 
       <configuration> 
        <artifactItems> 
         <artifactItem> 
          <groupId>your.group</groupId> 
          <artifactId>project.a</artifactId> 
          <version>...</version> 
          <type>war</type> 
          <overWrite>true</overWrite> 
          <outputDirectory>${project.build.directory}/myconfig/work</outputDirectory> 
          <includes>WEB-INF/web.xml</includes> 
         </artifactItem> 
        </artifactItems> 
       </configuration> 
      </execution> 
     </executions> 
    </plugin> 
    <plugin> 
     <groupId>com.google.code.maven-config-processor-plugin</groupId> 
     <artifactId>maven-config-processor-plugin</artifactId> 
     <version>2.0</version> 
     <executions> 
      <!-- Process extracted web.xml and place in temp build directory --> 
      <execution> 
       <id>process-webxml</id> 
       <goals> 
        <goal>process</goal> 
       </goals> 
       <configuration> 
        <outputDirectory>${project.build.directory}/myconfig/build</outputDirectory> 
        <transformations> 
         <transformation> 
          <input>${project.build.directory}/myconfig/work/WEB-INF/web.xml</input> 
          <output>WEB-INF/web.xml</output> 
          <!-- your transformation config --> 
         </transformation> 
        </transformations> 
       </configuration> 
      </execution> 
     </executions> 
    </plugin> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-war-plugin</artifactId> 
     <version>2.1.1</version> 
     <configuration> 
      <webResources> 
       <!-- Instruct war plugin to include temp build directory in webapp --> 
       <resource> 
        <directory>${project.build.directory}/myconfig/build</directory> 
        <includes> 
         <include>**</include> 
        </includes> 
       </resource> 
      </webResources> 
      <overlays> 
       <!-- Overlay customization if needed --> 
      </overlays> 
     </configuration> 
    </plugin> 
</plugins> 

至於我可以告訴大家,戰爭插件包括webResources第一,其次是src/main/webapp,其次是覆蓋。

我不熟悉maven-config-processor-plugin,所以如果我的配置不正確,我很抱歉。

+0

謝謝!像魅力一樣工作。 – M1EK

+0

也許這麼說吧。現在不工作;即使表示已跳過修改後的資源,也會被覆蓋覆蓋。 – M1EK

+0

但是修改後的資源在臨時編譯目錄中顯示正確(我的答案中爲'myconfig/build')? – matts

4

您可以使用unpack goal of maven-dependency-plugin來獲取項目A以在本地獲取web.xml,然後轉換它並指向maven-war-plugin to transformed web.xml

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>2.4</version> 
      <executions> 
       <execution> 
       <id>unpack</id> 
       <phase>generate-resources</phase> 
       <goals> 
        <goal>unpack</goal> 
       </goals> 
       <configuration> 
        <artifactItems> 
        <artifactItem> 
         <groupId>org.test</groupId> 
         <artifactId>test-war1</artifactId> 
         <version>0.0.1-SNAPSHOT</version> 
         <type>war</type> 
        </artifactItem>   
        </artifactItems> 
        <outputDirectory>${project.build.directory}/wars</outputDirectory> 
       </configuration> 
       </execution> 
      </executions> 
     </plugin> 

     <plugin> 
      <groupId>com.google.code.maven-config-processor-plugin</groupId> 
      <artifactId>maven-config-processor-plugin</artifactId> 
      <version>2.0</version> 
      <configuration> 
       <!-- 
        configure to transform file 
        ${project.build.directory}/wars/WEB-INF/web.xml 
        into 
        ${project.build.directory}/transformed/web.xml 
       --> 
      </configuration> 
      <executions> 
       <execution> 
        <goals> 
         <goal>process</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.2</version> 
      <configuration> 
       <warSourceDirectory>src/main/webapp</warSourceDirectory> 
       <webXml>${project.build.directory}/transformed/web.xml</webXml> 
      </configuration> 
     </plugin> 
    </plugins> 
    </build> 
+0

謝謝!相信這會起作用;首先嚐試了第一個建議,以便得到答案。 – M1EK

+0

太棒了!我試過這種方法,它的工作原理。我不知道你可以在'maven-war-plugin'中指定'web.xml'文件。 – Jens