簡介
maven的exec-maven-plugin插件主要是用來執行可執行jar包命令的插件,不少工具提供命令行式的交互,例如mybatis-generator,每一次運行都會敲很長的命令,很麻煩。java
還有的時候,你但願提供一個3方包給比人使用,爲了讓別人可以經過很是簡單的命令就能夠運行程序,就可使用exec-maven-plugin插件。apache
固然也能夠是腳本的方式來實現,可是腳本的通用性不是很好,你要提供run.bat,run.sh等腳本。經過exec-maven-plugin就能夠避免這樣的問題。mybatis
exec-maven-plugin插件有2個目錄(goal),一個是java一個是exec。這裏簡單解釋一下maven的goal,能夠把maven的goal看作是一個特定的功能,一個maven插件可能有不少功能,一個功能就是一個goal,maven還有生命週期的概念,maven有3套生命週期,分別是clean,default,site。每個生命週期有包含一下階段(phase),能夠把每個階段看作一個流程。參加後面的maven生命週期。例如執行下面的2個命令:jvm
mvn clean package mvn clean test
上面的2個命令都包含了2個生命週期,clean和default生命週期。clean會執行clean生命週期的pre-clean和clean階段,mvn clean package命令會從default生命週期會從validate執行到package階段,mvn clean test命令會從default生命週期的validate階段執行到package階段。maven
插件就是把goal綁定到生命指定階段的上執行的。就是maven在執行相應階段的時候會檢查有那些插件的goal綁定到這個階段上的,而後執行這些goal。工具
若是對這些知識有疑惑,強烈建議閱讀《maven實戰》。post
實例
java 目標
public class App { public static void main( String[] args ) { for(String arg : args){ System.out.println(arg); } } }
上面的代碼很是簡單,打印main方法參數。ui
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.freemethod</groupId> <artifactId>plugin</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>plugin</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <exec_maven_plugin_version>1.2.1</exec_maven_plugin_version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <!-- http://www.mojohaus.org/exec-maven-plugin/ --> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>${exec_maven_plugin_version}</version> <executions> <execution> <phase>test</phase> <goals> <goal>java</goal> </goals> <configuration> <mainClass>cn.freemethod.plugin.App</mainClass> <arguments> <argument>arg0</argument> <argument>arg1</argument> </arguments> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
看上面的配置,咱們把exec-maven-plugin 插件的java模板(goal)綁定到了default生命週期的test階段上。因此咱們只須要執行下面的命令就能夠了:url
mvn test
exec目標
import java.util.ArrayList; import java.util.List; public class Exec { public static void main(String[] args) { System.out.println(System.getProperty("systemProperty1")); System.out.println(System.getProperty("systemProperty2")); for(String arg:args){ System.out.println(arg); } testGcTypeLog(); } public static void testGcTypeLog(){ List<Object> list = new ArrayList<Object>(); while (true) { byte[] m = costMemory(1024*1024*10); list.add(m); if(list.size()==90){ list.clear(); } } } public static byte[] costMemory(int i) { byte[] m = new byte[i]; return m; } }
上面的例子就是打印指定的系統參數和不斷申請內存而後釋放內存,最要是爲了觀察打印日誌。spa
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.freemethod</groupId> <artifactId>plugin</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>plugin</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <exec_maven_plugin_version>1.2.1</exec_maven_plugin_version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <!-- http://www.mojohaus.org/exec-maven-plugin/ --> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>${exec_maven_plugin_version}</version> <executions> <execution> <phase>test</phase> <goals> <goal>exec</goal> </goals> <configuration> <executable>java</executable> <arguments> <argument>-DsystemProperty1=value1</argument> <argument>-DsystemProperty2=value2</argument> <argument>-XX:+PrintGCDetails</argument> <argument>-classpath</argument> <classpath /> <argument>cn.freemethod.plugin.Exec</argument> <argument>arg1</argument> <argument>arg2</argument> </arguments> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
上面的配置咱們也是把exec-maven-plugin插件的exec目標(goal)綁定到了default生命週期的test階段上,咱們配置了-DsystemProperty1=value1設置系統參數,配置-XX:+PrintGCDetails設置jvm參數。
仍是能夠經過下面的命令來執行:
mvn test
從上圖能夠看到打印了咱們設置的系統參數,命令參數和gc日誌。
固然也能夠不綁定生命週期,能夠像下面這樣配置:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>${exec_maven_plugin_version}</version> <configuration> <executable>java</executable> <arguments> <argument>-DsystemProperty1=value1</argument> <argument>-DsystemProperty2=value2</argument> <argument>-XX:+PrintGCDetails</argument> <argument>-classpath</argument> <classpath /> <argument>cn.freemethod.plugin.Exec</argument> <argument>arg1</argument> <argument>arg2</argument> </arguments> </configuration> </plugin>
若是像上面這樣配置就須要先打包,而後執行exec:
mvn clean package mvn exec:exec
maven生命週期
clean聲明週期:(3 phase(階段))
- pre-clean
- clean:清理上一次構建生成的文件
- post-clean
default聲明週期:(23 phase)
- validate
- initialize
- generate-sources
- process-sources:處理項目主資源文件,拷貝src/main/resources 到classpath
- generate-resources
- process-resources
- compile:編譯src/main/java代碼輸出到classpath
- process-classes
- generate-test-sources
- process-test-sources:對src/test/resource目錄進行變量替換,拷貝到test的classpath
- generate-test-resources
- process-test-resources
- test-compile
- process-test-classes
- test
- prepare-package
- package
- pre-integration-test
- integeration-test
- post-integration-test
- verify
- install:安裝到本地倉庫
- deploy
site生命週期:(4 phase)
- pre-site
- site
- post-site
- site-deploy