2012-04-12 81 views
5

我正在使用maven構建一個web應用程序項目,並將包裝設置爲「war」。我也使用YUI壓縮器插件來壓縮webapp目錄中的javascript代碼。我已經設置了YUI壓縮機是這樣的:構建戰爭時在maven項目中被覆蓋的文件

<plugin> 
    <groupId>net.alchim31.maven</groupId> 
    <artifactId>yuicompressor-maven-plugin</artifactId> 
    <version>1.3.0</version> 
    <executions> 
     <execution> 
     <phase>process-resources</phase> 
     <goals> 
      <goal>compress</goal> 
     </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <excludes> 
     <exclude>**/ext-2.0/**/*.js</exclude> 
     <exclude>**/lang/*.js</exclude> 
     <exclude>**/javascripts/flot/*.js</exclude> 
     <exclude>**/javascripts/jqplot/*.js</exclude> 
     </excludes> 
     <nosuffix>true</nosuffix> 
     <force>true</force> 
     <jswarn>false</jswarn> 
    </configuration> 
</plugin> 

如果我做的:MVN工藝資源,源/主/ web應用程序將會被複制到目標/ webapp的-1.0 /目錄下,javacripts被壓縮。但是,當我運行mvn install時,所有壓縮的javascript都被覆蓋,顯然打包過程在構建war文件之前一次從main/webapp複製內容。

我該如何解決這個問題?

回答

10

正如你注意到沒有,直到在封裝階段的戰爭插件執行/src/main/webapp目錄(又名warSourceDirectory)中的內容不會被複制到項目目錄進行包裝。當戰爭插件完成時,檔案已經建立;爲修改這些資源太晚了。如果要壓縮的.js文件移動到另一個目錄(/src/main/webapp之外),則可以執行下面的操作。

爲了測試,我創建了${basedir}/src/play目錄,其中包含一些文件。我使用resource插件作爲例子;你可以用你需要的YUI壓縮機插件配置來替換該配置,並簡單地將<webResource>元素添加到你的war插件配置中,如下所示;更多的信息在war plugin examples。我的戰爭結束了,我想要他們的附加文件。

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-resources-plugin</artifactId> 
    <executions> 
    <execution> 
     <id>copy-resources</id> 
     <phase>process-resources</phase> 
     <goals><goal>copy-resources</goal></goals> 
     <configuration> 
     <outputDirectory>${project.build.directory}/tmpPlay</outputDirectory> 
     <resources> 
      <resource> 
      <directory>${project.basedir}/src/play</directory> 
      <includes> 
       <include>**/*</include> 
      </includes> 
      </resource> 
     </resources> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-war-plugin</artifactId> 
    <executions> 
    <execution> 
     <id>default-war</id> 
     <configuration> 
     <webResources> 
      <resource> 
      <directory>${project.build.directory}/tmpPlay</directory> 
      <targetPath>WEB-INF/yourLocationHere</targetPath> 
      <includes> 
       <include>**/*</include> 
      </includes> 
      </resource> 
     </webResources> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 
0

在您的執行指令中,設置應用您的壓縮和複製的階段是安裝,並希望能做到這一點。代碼應該是這樣的:

​​
+0

這將是太晚了,我甚至試過,創建的war文件沒有壓縮的javascript代碼。 – 2012-04-13 00:19:41

+0

如果向war插件添加階段指令,並將壓縮階段設置爲'prepare-package',將其設置爲'package'或'install'?基本上確保在壓縮* .js文件後發生戰爭? – nemo 2012-04-13 17:17:21

4

我覺得@ user944849的答案是正確的答案,正確答案的至少一個。歸檔此的另一種方法是排除Maven的戰爭插件配置修改的javascript目錄,例如:

<plugin> 
    <artifactId> maven-war-plugin </artifactId> 
    <configuration> 
     <warSourceExcludes>**/external/ dojo/**/*.js </warSourceExcludes> 
    </configuration> 
</plugin> 

這將告訴Maven的戰爭插件不會從排斥目錄複製,但由於修改後的JavaScript目錄已經存在,war文件仍然包含javascript目錄,但帶有修改的,在這種情況下是壓縮的javascript代碼。

+0

這對我有效.. :) – Venky 2012-09-12 01:04:02

0

這裏是我的解決方案,只需添加一個插件antrun使用處理後輸出一個更新打包war文件,結合到封裝階段:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-antrun-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>package</id> 
        <phase>package</phase> 
        <configuration> 
         <target> 
          <zip basedir="${project.build.directory}/${project.build.finalName}" 
           destfile="${project.build.directory}/${project.build.finalName}.war" 
           update="true"> 
          </zip> 
         </target> 
        </configuration> 
        <goals> 
         <goal>run</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin>