常用maven外掛配置彙總
最近接觸用maven達成jar包,但是發現好多配置不知道有啥作用,查出來都是外掛。Maven本質上是一個外掛框架,它的核心並不執行任何具體的構建任務,所有這些任務都交給外掛來完成,進一步說,每個任務對應了一個外掛目標(goal),每個外掛會有一個或者多個目標。
首先看下全域性變數配置,下面的外掛中會用到。:
<!-- 全域性屬性配置 -->
<properties>
<project.build.name>tools</project.build.name>
<project.build.sourceEncoding >UTF-8</project.build.sourceEncoding>
</properties>
一、編譯外掛
<!-- 編譯外掛 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source >
<target>1.6</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
source: 原始碼編譯版本;
target: 目標平臺編譯版本;
encoding: 字符集編碼。
二、設定資原始檔的編碼方式
<!-- 設定資原始檔的編碼方式 -->
<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目錄
<!-- 依賴外掛 -->
<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包
<!-- 原始碼打包外掛 -->
<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包
<!-- 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包
<!-- 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檔案。
可以在當前目錄下直接使用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)間隔開。
七、在打包時,需要清空一些指定的目錄
配置描述: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的目錄時候用到的標籤不能亂用,比如
private File directory;
private String[] includes;
private String[] excludes;
private boolean followSymlinks;
八、利用tomcat-maven-plugin外掛將專案自動打包並部署到tomcat中
<!-- 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>
<phase>deploy</phase>
<goals>
<goal>deploy</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
path: 是指專案部署到tomcat後的專案名稱
url: 是指tomcat的manager訪問地址
server: 這個是tomcat服務名稱設定,需要配置maven的settings.xml檔案,在servers節點中手動配置server,如下所示:
<server>
<id>tomcat6-manager</id>
<username>admin</username>
<password>admin</password>
</server>
九、利用cargo-maven2-plugin外掛將專案自動打包並部署到tomcat中
配置描述:使用maven做web專案時,cargo外掛可以幫助你完成WAR包到伺服器的部署及伺服器的啟動和關閉等工作,方便,快速!
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.2.0</version>
<configuration>
<container>
<containerId>${server_name}</containerId>
<home>${server_home}</home>
</container>
<configuration>
<type>existing</type>
<home>${server_home}</home>
<properties>
<cargo.servlet.port>8088</cargo.servlet.port>
</properties>
</configuration>
</configuration>
</plugin>
注意,如果你的tomcat伺服器的埠使用的不是預設的8080(如本例中的8088),則需要使用cargo.servlet.port引數將cargo的監聽埠也配置到tomcat的那個監聽埠(如本例中的8088),否則使用mvn cargo:run啟動的伺服器會在120000毫秒(120秒)後自動關閉!
mvn cargo:start命令完成WAR包部署後,啟動伺服器,然後會將伺服器立即關掉;
mvn cargo:run命令完成WAR包部署後,啟動伺服器,直到你Ctrl+C將伺服器關掉;
mvn cargo:stop命令關閉伺服器。
<plugin>
<!-- 指定外掛名稱及版本號 -->
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.2.3</version>
<!-- 外掛的Tomcat6.x配置 -->
<configuration>
<!-- 容器的配置 -->
<container>
<!-- 指定伺服器版本 -->
<containerId>tomcat6x</containerId>
<!-- 指定伺服器的安裝目錄 -->
<home>E:\Program Files\tomcat-6.0.32</home>
</container>
<!-- 具體的配置 -->
<configuration>
<!-- 部署模式:existing、standalone等 -->
<type>existing</type>
<!-- Tomcat的位置,即catalina.home -->
<home>E:\Program Files\tomcat-6.0.32</home>
<!-- 配置屬性 -->
<properties>
<!-- 管理地址 -->
<cargo.tomcat.manager.url>http://localhost:8080/manager</cargo.tomcat.manager.url>
<!-- Tomcat使用者名稱 -->
<cargo.remote.username>admin</cargo.remote.username>
<!-- Tomcat密碼 -->
<cargo.remote.password>admin</cargo.remote.password>
<!-- <cargo.jvmargs> -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8787 </cargo.jvmargs> -->
</properties>
</configuration>
</configuration>
</plugin>
username和password: 是指tomcat的tomcat-users.xml檔案中配置的,檔案路徑為E:\Program Files\tomcat-6.0.32\conf\tomcat-users.xml,如下所示:
<role rolename="manager"/>
<user password="admin" roles="manager" username="admin"/>
十、有時候外掛檢查不通過,需要人為的忽略對有些外掛的檢查
<!-- 外掛管理 -->
<pluginManagement>
<plugins>
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<!-- 忽略2.0以上版本的maven-dependency-plugin的檢查 -->
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<versionRange>[2.0,)</versionRange>
<goals>
<goal>copy-dependencies</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore />
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
十一、maven-resources-plugin
配置描述:把web專案的輸出copy到tomcat的webapp下
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<executions>
<execution>
<id>deploy-website</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${server_home}/webapps/${project.build.finalName}</outputDirectory>
<resources>
<resource>
<directory>${project.build.directory}/${project.build.finalName}</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
十二、maven-antrun-plugin
配置描述:在maven中使用antrun呼叫bat檔案
(我這裡呼叫的是tomcat的startup.bat檔案,但是沒有成功啟動tomcat,提示說環境變數沒配置,可我雙擊執行startup.bat將就可以執行,奇怪了……)
(現在知道原因了:antrun執行的bat檔案,實際上是在
解決方法:使用令一個bat檔案,如mystartup.bat執行startup.bat,注意在執行startup.bat之前,需要在mystartup.bat檔案中把目錄切換到startup.bat所在的目錄,搞定!
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>start-server</id>
<phase>package</phase>
<configuration>
<tasks>
<exec
executable="${server_home}/bin/startup.bat"
>
</exec>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>