maven 常用外掛配置詳解
Java程式碼
- <!-- 全域性屬性配置 -->
- <properties>
- <project.build.name>tools</project.build.name>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- </properties>
project.build.name: 用來定義war包名稱
project.build.sourceEncoding: 用來定義資原始檔的編碼格式
下面開始講解常用的maven外掛配置
一、編譯外掛
Java程式碼
- <!-- 編譯外掛 -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <configuration>
- <source>1.6
- <target>1.6</target>
- <encoding>${project.build.sourceEncoding}</encoding>
- </configuration>
- </plugin>
source:原始碼編譯版本;
target:目標平臺編譯版本;
encoding:字符集編碼。
二、設定資原始檔的編碼方式
Java程式碼
- <!-- 設定資原始檔的編碼方式 -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-resources-plugin</artifactId>
- <version>2.4.3</version>
- <executions>
- <execution>
- <phase>compile</phase>
- </execution>
- </executions>
- <configuration>
- <encoding>${project.build.sourceEncoding}</encoding>
- </configuration>
- </plugin>
xml、properties檔案都是資原始檔,編碼的時候遇到中文總要進行轉碼!用什麼編碼?UTF-8,那就記得強制<encoding>${project.build.sourceEncoding}</encoding>
三、自動拷貝jar包到target目錄
Java程式碼
- <!-- 依賴外掛 -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
- <version>2.6</version>
- <executions>
- <execution>
- <id>copy-dependencies</id>
- <phase>compile</phase>
- <goals>
- <goal>copy-dependencies</goal>
- </goals>
- <configuration>
- <!-- ${project.build.directory}為Maven內建變數,預設為target -->
- <outputDirectory>${project.build.directory}/lib</outputDirectory>
- <!-- 表示是否不包含間接依賴的包 -->
- <excludeTransitive>false</excludeTransitive>
- <!-- 表示複製的jar檔案去掉版本資訊 -->
- <stripVersion>true</stripVersion>
- </configuration>
- </execution>
- </executions>
- </plugin>
在部署war包時,需要將專案依賴的jar包,也打到war包中,因此就會用到上述外掛
四、生成原始碼jar包
Java程式碼
- <!-- 原始碼打包外掛 -->
- <plugin>
- <artifactId>maven-source-plugin</artifactId>
- <version>2.1</version>
- <configuration>
- <!-- <finalName>${project.build.name}</finalName> -->
- <attach>true</attach>
- <encoding>${project.build.sourceEncoding}</encoding>
- </configuration>
- <executions>
- <execution>
- <phase>compile</phase>
- <goals>
- <goal>jar</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
該外掛主要用於在打jar包時,把原始碼也打成jar包
五、將專案打成jar包
Java程式碼
- <!-- jar包外掛 -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jar-plugin</artifactId>
- <version>2.4</version>
- <configuration>
- <archive>
- <manifest>
- <!-- 告知 maven-jar-plugin新增一個 Class-Path元素到 MANIFEST.MF檔案,以及在Class-Path元素中包括所有依賴項 -->
- <addClasspath>true</addClasspath>
- <!-- 所有的依賴項應該位於 lib資料夾 -->
- <classpathPrefix>lib/</classpathPrefix>
- <!-- 當用戶使用 lib命令執行JAR檔案時,使用該元素定義將要執行的類名 -->
- <mainClass>com.zhengtian.tools.service.phone.MobilePhoneTool</mainClass>
- </manifest>
- </archive>
- </configuration>
- </plugin>
在將專案打成jar包時,有時會需要將專案打成可以直接執行的jar包,因此就需要將專案依賴的jar包也打入jar包中,此時需要在Eclipse上安裝例外一個外掛,用來打可執行jar包,詳情見連結http://zheng12tian.iteye.com/blog/1765626
六、將專案打成war包
Java程式碼
- <!-- war外掛 -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-war-plugin</artifactId>
- <version>2.1.1</version>
- <configuration>
- <!-- <warName>${project.build.name}</warName> -->
- </configuration>
- </plugin>
encoding:強制字符集編碼
warName:war包名字——platform.war
webappDirectory:產生war前,用於存放構建war包的目錄——target/platform。
warSourceDirectory:我把web工程搞成了eclipse下的WTP型別。我不喜歡maven產生的webapp目錄,更喜歡WebContent!
需要注意的是:
採用上述外掛部署專案的話,使用clean package tomcat:redeploy命令。使用該命令前,需要先啟動tomcat,實際上是為了讓tomcat啟動manager專案,實現動態部署
此部署方式雖然也是動態部署的範疇,但是每次修改檔案後,需要手動再次重新部署,才會載入更改。
如果想讓tomcat自動掃描專案的改動,自動載入,那麼需要將maven工程的java全部編譯的webapp目錄下,然後將jar包和資原始檔也打到webapp目錄。最後在$CATALINA_HOME/conf /Catalina/localhost中新增一個xml檔案,修改docbase為webapp目錄。
Tomcat常用的部署方式介紹:http://blog.csdn.net/yangxueyong/article/details/6130065
配置描述:當你的pom檔案中把你的當前專案的packaging配置為war後,maven會使用該外掛將當前專案生成war檔案,但是有時候我們不想要war檔案,只想讓maven生成當前專案的網站目錄結構,尤其是在除錯的時候,因為生成war檔案的同時,會生成當前專案的網站目錄結構,這樣一來,浪費了打包的時間和磁碟的空間!
maven使用war外掛生成war檔案所用的目標(goal)為war,從幫助文件中可以看出,war外掛還有一個目標(goal)是exploded,即,只生成目錄結構,而不生成war檔案。
參見:http://maven.apache.org/plugins/maven-war-plugin/plugin-info.html
可以在當前目錄下直接使用mvn war:exploded,就能生成當前專案的網站目錄結構。
使用mvn war:exploded生成網站目錄結構的時候,war外掛會把src/main/webapp目錄下的內容全部copy到target/${finalName}目錄下,但是,有時候webapp裡的一些資源部需要copy,比如我會在src/main/webapp的js目錄下放很多jQuery的外掛,其中包括外掛的幫助文件;但是我可能只會用到其中一部分外掛。所以在生成網站目錄結構的時候,我根本不需要把src/main/webapp的js目錄下的所以檔案都copy到target/${finalName}目錄中,這時候就需要對exploded目標(goal)進行資源過濾了——不把沒用的資源copy到網站的目錄結構中去:
- <plugin>
- <artifactId>maven-war-plugin</artifactId>
- <configuration>
- <warSourceExcludes>js/參考/**</warSourceExcludes>
- </configuration>
- </plugin>
說明:上面的配置,使用了war外掛的warSourceExcludes引數,該引數是一個String型別,需要把被排除的路徑或檔案使用逗號(comma)間隔開。
參見:
1、http://www.wsria.com/archives/1335
2、http://maven.apache.org/plugins/maven-war-plugin/exploded-mojo.html#warSourceDirectory
七、在打包時,需要清空一些指定的目錄
配置描述:maven提供了很多有用外掛,如mvn clean使用到的maven-clean-plugin,mvn compile使用到的maven-compile-plugin等,這些外掛可以通過pom檔案繫結到maven三個生命週期(life-cycle)的各階段(phase)上,也可以在命令列(如Windows下的cmd)中單獨由mvn命令呼叫,如mvn clean,可以呼叫maven-clean-plugin的clean目標(goal)。對於繫結到各階段(phase)執行的外掛的引數(parameter)可以用<configuration>標籤(tag)配置,但是在該外掛在命令列下單獨由mvn命令呼叫,那麼這個引數該如何使用pom檔案配置呢?比如,在一個J2EE專案中,想使用mvn clean命令清除target裡的內容的同時,也清除tomcat/webapp下的相應目錄,該怎麼辦呢?這就需要在pom檔案中對外掛進行全域性配置了。
- <plugin>
- <artifactId>maven-clean-plugin</artifactId>
- <configuration>
- <verbose>true</verbose>
- <filesets>
- <fileset>
- <directory>c:/a</directory>
- </fileset>
- </filesets>
- </configuration>
- </plugin>
外掛的配置分為區域性配置和全域性配置,本文中對antrun和resource外掛的配置是區域性配置,對clean外掛的配置是全域性配置,能看出差別吧?
區域性配置的<configuration>標籤(tag)放在<execution>標籤(tag)裡邊,而全域性配置的<configuration>標籤(tag)則放在<plugin>標籤(tag)裡邊,因為全域性配置里根本就沒有<execution>標籤(tag),因為全域性配置針對的是該外掛的全部目標(goal)配置的!
本例中,刪除的是C:/a目錄,即,當用戶在該maven專案中執行mvn clean後,除了刪除clean外掛預設的project.build.directory, project.build.outputDirectory,project.build.testOutputDirectory, 和 project.reporting.outputDirectory目錄外
還會刪除C:/a目錄。
注意,該配置僅針對本專案有效,即,使用者在當前專案下使用mvn clean時,會刪除C:/a目錄;當用戶在其他沒有如此配置clean外掛的maven專案中執行mvn clean時,不會刪除C:/a目錄。
設定fileset的目錄時候用到的<directory>標籤不能亂用,比如<dir>,否則maven沒法識別,因為maven使用pom設定外掛引數(parameter)的時候用的是設定java bean的方式,之所以用<directory>標籤,是因為在org.apache.maven.plugin.clean.Fileset.java中,Fileset類只有如下成員變數:
(參見:http://search.maven.org/remotecontent?filepath=org/apache/maven/plugins/maven-clean-plugin/2.4.1/maven-clean-plugin-2.4.1-source-release.zip)
- private File directory;
- private String[] includes;
- private String[] excludes;
- privateboolean followSymlinks;
相關閱讀:
1、Maven clean plugin - delete additional directories
八、利用tomcat-maven-plugin外掛將專案自動打包並部署到tomcat中Java程式碼
- <!-- tomcat外掛 -->
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>tomcat-maven-plugin</artifactId>
- <configuration>
- <server>tomcat6-manager</server>
- <path>/${project.build.name}</path>
- <url>http://localhost:8080/manager</url>
- <username>admin</username>
- <password>admin</password>
- </configuration>
- <executions>
- <execution>