profile相關知識點:
在開發項目時,設想有以下場景:
- 你的Maven項目存放在一個遠端代碼庫中(比如github),該項目需要通路資料庫,你有兩台電腦,一台是Linux,一台是Mac OS X,你希望在兩台電腦上都能做項目開發。但是,安裝Linux的電腦上安裝的是MySQL資料庫,而Mac OS X的電腦安裝的是PostgreSQL資料庫。此時你需要找到一種簡單的方法在兩種資料庫連接配接中進行切換,你會怎麼做?
- 此外,你的項目需要部署。為了調試,在開發時我們在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.