2016-06-13 91 views
3

我正在嘗試使用maven-assembly-plugin來構建一個輕量級和胖的web應用程序,之後應用程序將擁有不同的內容。我認爲我實際上可以使用兩個配置文件mvn -Pliteweb,fatweb package,因此它會爲每個配置文件創建兩個構建配件。但是當我運行它時,它實際上只創建了一個位於pom(liteweb)底部位置的程序集。我已經嘗試過,當我逐一構建它時,它就沒有問題。我也檢查mvn help:active-profiles -P fatweb,liteweb,它正確顯示2活動配置文件。Maven maven-assembly-plugin使用配置文件構建

下面是我的測試pom(它不包括這裏的區別,我只是希望它分別創建2個War文件和其他程序集文件)。我對Maven仍然很陌生,所以我可能會誤解這一點。從多個配置文件創建多個程序集是可能的嗎?

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 

<modelVersion>4.0.0</modelVersion> 
<groupId>com.test.web</groupId> 
<artifactId>TEST_WEB</artifactId> 
<packaging>war</packaging> 
<name>WEB Application</name> 
<version>0.0.1</version> 

<properties> 
    <litewebPath>src/main/lite</litewebPath> 
    <fatwebPath>src/main</fatwebPath> 
</properties> 

<profiles> 
    <profile> 
     <id>fatweb</id> 
     <build> 
      <resources> 
       <resource> 
        <directory>${fatwebPath}/resources</directory> 
        <filtering>true</filtering> 
       </resource> 
      </resources> 
      <finalName>WEB-${project.version}</finalName> 
      <plugins> 
       <plugin> 
        <artifactId>maven-assembly-plugin</artifactId> 
        <version>2.6</version> 
        <configuration> 
         <descriptors> 
          <descriptor>fatassembly.xml</descriptor> 
         </descriptors> 
        </configuration> 
        <executions> 
         <execution> 
          <id>exec1</id> 
          <phase>package</phase> 
          <goals> 
           <goal>single</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 

      </plugins> 
     </build> 
    </profile> 
    <profile> 
     <id>liteweb</id> 
     <build> 
      <resources> 
       <resource> 
        <directory>${litewebPath}/resources</directory> 
        <filtering>true</filtering> 
       </resource> 
      </resources> 
      <finalName>LITEWEB-${project.version}</finalName> 
      <plugins> 
       <plugin> 
        <artifactId>maven-assembly-plugin</artifactId> 
        <version>2.6</version> 
        <configuration> 
         <descriptors> 
          <descriptor>liteassembly.xml</descriptor> 
         </descriptors> 
        </configuration> 
        <executions> 
         <execution> 
          <id>exec2</id> 
          <phase>package</phase> 
          <goals> 
           <goal>single</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
</profiles> 

fatassembly.xml現在我沒有把任何東西只是爲了確保一切工作。

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> 

    <id>lib</id> 
    <formats> 
     <format>zip</format> 
    </formats> 
    <dependencySets> 
     <dependencySet> 
     </dependencySet> 
    </dependencySets> 
</assembly> 

liteassembly.xml相同我沒有把任何東西,以確保一切工作,但我已經測試與不同的東西里面仍然不工作。

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> 

    <id>lib-lite</id> 
    <formats> 
     <format>zip</format> 
    </formats> 
    <dependencySets> 
     <dependencySet> 
     </dependencySet> 
    </dependencySets> 
</assembly> 

當執行mvn help:active-profiles -Pfatweb,liteweb

Active Profiles for Project 'com.test.web:TEST_WEB:war:0.0.1': 

The following profiles are active: 

- fatweb (source: com.test.web:TEST_WEB:0.0.1) 
- liteweb (source: com.test.web:TEST_WEB:0.0.1) 

並在下面當我執行MVN -Pfatweb,liteweb清潔套裝好像它建同一個zip兩次發生什麼。從相同的XML組件,但實際上從不同的執行(exec1和exec2)

[INFO] Scanning for projects... 
[INFO] 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building WEB Application 0.0.1 
[INFO] ------------------------------------------------------------------------ 
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ TEST_WEB --- 
[INFO] Deleting D:\PROJECT\POMTEST\target 
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ TEST_WEB --- 
[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. build is platform dependent! 
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent! 
[INFO] Copying 0 resource 
[INFO] Copying 0 resource 
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ TEST_WEB --- 
[INFO] No sources to compile 
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ TEST_WEB --- 
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent! 
[INFO] skip non existing resourceDirectory D:\PROJECT\POMTEST\src\test\resources 
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ TEST_WEB --- 
[INFO] No sources to compile 
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ TEST_WEB --- 
[INFO] No tests to run. 
[INFO] 
[INFO] --- maven-war-plugin:2.2:war (default-war) @ TEST_WEB --- 
[INFO] Packaging webapp 
[INFO] Assembling webapp [TEST_WEB] in [D:\PROJECT\POMTEST\target\LITEWEB-0.0.1] 
[INFO] Processing war project 
[INFO] Copying webapp resources [D:\PROJECT\POMTEST\src\main\webapp] 
[INFO] Webapp assembled in [27 msecs] 
[INFO] Building war: D:\PROJECT\POMTEST\target\LITEWEB-0.0.1.war 
[INFO] WEB-INF\web.xml already added, skipping 
[INFO] 
[INFO] --- maven-assembly-plugin:2.6:single (exec1) @ TEST_WEB --- 
[INFO] Reading assembly descriptor: liteassembly.xml 
[INFO] Building zip: D:\PROJECT\POMTEST\target\LITEWEB-0.0.1-lib-lite.zip 
[INFO] 
[INFO] --- maven-assembly-plugin:2.6:single (exec2) @ TEST_WEB --- 
[INFO] Reading assembly descriptor: liteassembly.xml 
[INFO] Building zip: D:\PROJECT\POMTEST\target\LITEWEB-0.0.1-lib-lite.zip 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 1.961 s 
[INFO] Finished at: 2016-06-14T15:23:05+08:00 
[INFO] Final Memory: 12M/229M 
[INFO] ------------------------------------------------------------------------ 

所以個人資料確實活躍,但之後即構建目標文件夾中的一個只有LITEWEB。如果有人知道,請幫我理解爲什麼它不會創建兩個,爲什麼mvn像構建zip兩次。我知道解決方法只是構建兩次的shell腳本代碼(如果每次構建正確時都構建一個配置文件),但我只想使用mvn特定構建。

下面是如果我做mvn -Pfatweb,liteweb clean install這個庫創建兩次,但它只構建WAR文件一次。從日誌中我實際上意識到構建WAR的是戰爭插件,但是如何讓它執行兩個配置文件..?

[INFO] Scanning for projects... 
[INFO] 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building WEB Application 0.0.1 
[INFO] ------------------------------------------------------------------------ 
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ TEST_WEB --- 
[INFO] Deleting D:\PROJECT\POMTEST\target 
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ TEST_WEB --- 
[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. build is platform dependent! 
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent! 
[INFO] Copying 0 resource 
[INFO] Copying 0 resource 
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ TEST_WEB --- 
[INFO] No sources to compile 
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ TEST_WEB --- 
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent! 
[INFO] skip non existing resourceDirectory D:\PROJECT\POMTEST\src\test\resources 
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ TEST_WEB --- 
[INFO] No sources to compile 
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ TEST_WEB --- 
[INFO] No tests to run. 
[INFO] 
[INFO] --- maven-war-plugin:2.2:war (default-war) @ TEST_WEB --- 
[INFO] Packaging webapp 
[INFO] Assembling webapp [TEST_WEB] in [D:\PROJECT\POMTEST\target\LITEWEB-0.0.1] 
[INFO] Processing war project 
[INFO] Copying webapp resources [D:\PROJECT\POMTEST\src\main\webapp] 
[INFO] Webapp assembled in [26 msecs] 
[INFO] Building war: D:\PROJECT\POMTEST\target\LITEWEB-0.0.1.war 
[INFO] WEB-INF\web.xml already added, skipping 
[INFO] 
[INFO] --- maven-assembly-plugin:2.6:single (exec1) @ TEST_WEB --- 
[INFO] Reading assembly descriptor: fatassembly.xml 
[INFO] Building zip: D:\PROJECT\POMTEST\target\LITEWEB-0.0.1-lib.zip 
[INFO] 
[INFO] --- maven-assembly-plugin:2.6:single (exec2) @ TEST_WEB --- 
[INFO] Reading assembly descriptor: liteassembly.xml 
[INFO] Building zip: D:\PROJECT\POMTEST\target\LITEWEB-0.0.1-lib-lite.zip 
[INFO] 
[INFO] --- maven-install-plugin:2.4:install (default-install) @ TEST_WEB --- 
[INFO] Installing D:\PROJECT\POMTEST\target\LITEWEB-0.0.1.war to C:\Users\rm\.m2\repository\com\test\web\TEST_WEB\0.0.1\TEST_WEB-0.0.1.war 
[INFO] Installing D:\PROJECT\POMTEST\pom.xml to C:\Users\rm\.m2\repository\com\test\web\TEST_WEB\0.0.1\TEST_WEB-0.0.1.pom 
[INFO] Installing D:\PROJECT\POMTEST\target\LITEWEB-0.0.1-lib.zip to C:\Users\rm\.m2\repository\com\test\web\TEST_WEB\0.0.1\TEST_WEB-0.0.1-lib.zip 
[INFO] Installing D:\PROJECT\POMTEST\target\LITEWEB-0.0.1-lib-lite.zip to C:\Users\rm\.m2\repository\com\test\web\TEST_WEB\0.0.1\TEST_WEB-0.0.1-lib-lite.zip 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 6.768 s 
[INFO] Finished at: 2016-06-16T10:49:10+08:00 
[INFO] Final Memory: 12M/174M 
[INFO] ------------------------------------------------------------------------ 
+0

'程序集'已棄用,您應該使用'single'。但是,你也應該將'maven-assembly-plugin'綁定到一個階段,比如'package'。它不會被調用。 – Tunaki

+0

@Tunaki我實際上首先使用了'包',但不知何故它看起來像構建了WAR和描述符兩次,結果是一個,但是從日誌中它執行了兩次。 無論如何,我現在使用了包裝階段。 對於單機,我已經嘗試過,仍然是相同的,它不能正確創建兩個WAR – leafy

+0

好吧,我只是意識到,如果我只調用'mvn -Pliteweb軟件包',它只會在maven日誌中執行一次。 (使用階段'package'和'single'目標)所以看起來目標被調用了兩次,但不知何故不是正確的(相同的目標執行了兩次)。 – leafy

回答

1

在你的POM移動你的<configuration>部分FROM<plugin><execution>下。對<configuration>這兩個部分執行此操作。

錯誤在於您配置了插件2次。當兩個配置文件都處於活動狀態時,maven合併這兩個配置,丟失一個配置文件。

+0

你是對的,現在它正確地從兩個配置文件中取得。但命名仍然使用最後一個,它沒有建立WAR文件。它是同樣的問題? Maven將插件看作同一個插件,所以它只能創建1個WAR?是否有可能在最終名稱後面創建每個WAR文件和lib.zip? (就像我一個接一個地構建它一樣) – leafy

+0

不要看着你的目標文件夾。最終名稱僅影響目標文件夾中的文件名。事實在於您的本地存儲庫(安裝)或遠程存儲庫(部署)。這是其他人引用您的工件的文件名(座標)。應該有2個不同的文件,因爲即使在本地文件夾(.m2存儲庫...)中,您在2個assembly.xml中提供了2個不同的ID, – mediahype

+0

也只會創建一個war文件。實際上,我總是部署一個目標文件文件夾不在Maven倉庫中。這是不正確的? – leafy