天天看點

Spring Mvc + Maven + yuicompressor 使用 profile 來壓縮 javascript ,css 檔案; (十)

profile相關知識點:

在開發項目時,設想有以下場景:

  1. 你的Maven項目存放在一個遠端代碼庫中(比如github),該項目需要通路資料庫,你有兩台電腦,一台是Linux,一台是Mac OS X,你希望在兩台電腦上都能做項目開發。但是,安裝Linux的電腦上安裝的是MySQL資料庫,而Mac OS X的電腦安裝的是PostgreSQL資料庫。此時你需要找到一種簡單的方法在兩種資料庫連接配接中進行切換,你會怎麼做?
  2. 此外,你的項目需要部署。為了調試,在開發時我們在Java編譯結果中加入了調試資訊(Java預設)。而在部署時你希望Java編譯結果中不出現調試資訊。此時你又會怎麼做?

答案是Profile。Maven的Profile用于在不同的環境下應用不同的配置。一套配置即稱為一個Profile。這裡的“環境”可以是作業系統版本,JDK版本或某些檔案是否存在這樣的實體環境,也可以是你自己定義的一套邏輯環境。比如上面的A中所說的Linux和Mac OS X便是一種實體環境,而B中講的開發環境和部署環境則為邏輯環境。Maven提供了Activation機制來激活某個Profile,它既允許自動激活(即在某些條件滿足時自動使某個Profile生效),也可以手動激活。

一個Profile幾乎可以包含所有能夠出現在pom.xml中的配置項,比如<artifactId>,<outputDirectory>等。相當于在Profile中定義的配置資訊會覆寫原有pom.xml中的相應配置項。

profile 的基本結構:

<profiles>
    <profile>
        <id>profileId</id>
        <activation>
            <activeByDefault>true|false</activeByDefault>
        </activation>
        <properties>
            <fruit>XXXXX</fruit>
        </properties>
        <build>
            <plugins>
                <plugin>....</plugin>
            </plugins>
        </build>
    </profile>
</profiles>      

profile 幾乎可以包含 pom.xml 中所有的配置;

執行指令:mvn [clear | install] -PprofileId

配置springMvc下的壓縮插件,并且打包成war,是以配置如下:

<profiles>
    <!--js、css壓縮-->
        <profile>
            <id>jscsscompress</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <build>
                <plugins>

                    <plugin>
                        <groupId>net.sf.alchim</groupId>
                        <artifactId>yuicompressor-maven-plugin</artifactId>
                        <version>0.7.1</version>
                        <executions>
                            <execution>
                                <phase>compile</phase>
                                <goals>
                                    <goal>compress</goal>
                                </goals>
                            </execution>
                        </executions>  
                        <configuration>
                            <encoding>UTF-8</encoding>
                            <nosuffix>true</nosuffix>
                            <jswarn>false</jswarn>
                            <!-- 将已壓縮,或可能壓縮會出錯的檔案删除 -->
                            <excludes>
                                <exclude>**/*min.js</exclude>
                            
                            </excludes>
                        </configuration>      
                    </plugin>

                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-war-plugin</artifactId>
                        <version>2.3</version>
                        <configuration>
                            <!--
                            <warSourceExcludes>**/*.js,**/*.css</warSourceExcludes>
                            -->
                            <!-- 将壓縮未處理的所有檔案都包含進來,包括未處的 js,css, 以及圖檔,未網頁檔案等都包含進來 -->
                            <warSourceIncludes>

                            **/*min.js,
                            images/**,
                            META-INF/**,
                            **/*.xml,
                            **/*.jsp,
                            **/*.gif,
                            **/*.jpg,
                            **/*.png
                            </warSourceIncludes>    
                            
                            <webXml>src/main/webapp/WEB-INF/web.xml</webXml>
                             
                        </configuration>
                    </plugin>
                    
                </plugins>
            </build>
        </profile>
    </profiles>      

該profile Id為jscsscompress, 是以運作為mvn clean install -Pjscsscompress

<activation>

     <activeByDefault>false</activeByDefault>

</activation>

activeByDefault表示是否自動執行,還是手動執行,如果為true, 隻要mvn clean install ,如果為false 則 後面要加 -Pjscsscompress

采用 yuicompressor插件來壓縮,這個插件有兩個源:net.sf.alchim還有net.alchim31.maven,兩個效果跟配置都一樣.

當<phase>compile</phase> 中phase的值為compile, install, resource_js_css部分的值時,會提示不支援。生命周期不對問題

則需要添加:

<pluginManagement>
<plugins>
<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
<plugin>
     <groupId>org.eclipse.m2e</groupId>
     <artifactId>lifecycle-mapping</artifactId>
     <version>1.0.0</version>
     <configuration>
          <lifecycleMappingMetadata>
               <pluginExecutions>
                    <pluginExecution>
                         <pluginExecutionFilter>
                              <groupId>
                                        net.alchim31.maven
                              </groupId>
                              <artifactId>
                                   yuicompressor-maven-plugin
                              </artifactId>
                              <versionRange>
                                   [1.3.0,)
                              </versionRange>
                              <goals>
                                   <goal>compress</goal>
                              </goals>
                         </pluginExecutionFilter>
                         <action>
                              <ignore></ignore>
                         </action>
                    </pluginExecution>      

這樣的節點,在出錯時在 phase節點顯示提示,滑鼠移上去,它會展開一個可能處理錯誤的 tip 層,點選第一項即可自動生成.

-------------------------------------------------------------------------------------------

但如果phase配置為package就不會有錯誤.

------------------------------------------------------------------------------------------

package是最後執行的配置,他在打包war後執行...

plugins下配置的插件,如果本地倉庫沒有的話,也會自動下載下傳,跟dependency依賴包一樣.

-----------------------------------------------------------------------------------------

Encoding編碼設定對于utf-8源碼似乎是必須的.

jswarn 為 false時忽略本不提示腳本錯誤.

configuration下include表示包含檔案,這個基本不用配置,因為這個插件用來壓縮src/main/webapp下所有的腳本跟css檔案

exclude表示忽略某些檔案:

**.js表示根目錄下的所有腳本

**/*.js表示根目錄及所有子目錄的所有腳本.

xxx/**/**min.js 等等這樣的配置.      

maven-war-plugin 插件說明:

其實war這個插件,預設是有的,但是我們上面做了壓縮忽略了些檔案,在這裡需要做下過濾.

configuration下有兩個配置

warSourceIncludes表示包含某些檔案或檔案夾.

warSourceExcludes表示忽略某些檔案及檔案夾。

------

打包war需要将src/main/webapp下的檔案全都打包到target的項目名下.

但是yuicompressor也會将 檔案打包到 target/項目名下.

由于都采 compile 方式,yuicompress排在前面,是以yui先打包,war後再打包.

war如果沒有配置,則會将 src/main/webapp下所有的檔案都打包到target/項目名下,就是覆寫掉yui打包進來的檔案。

是以要對war進行過濾.

warSourceExcludes表示某些檔案不放進來,就是某些檔案不覆寫yui的檔案,這些檔案為yui exludes掉的檔案。

這裡沒用warSourceExcludes.

這裡用warSourceIncludes,把yui未壓縮的包含進來,以及所有靜态檔案夾js/resources/css所包含的其他格式檔案,以及所有非靜态的檔案夾...

-------

最後執行 mvn clean install -Pjscsscompress 壓縮打包生成 war.

繼續閱讀