Exec Maven Plugin全面解析和使用示例

1.爲何使用exec?html


如今的工程每每依賴 衆多的jar包,不像war包工程,對於那些打包成jar包形式的本地java應用來講,經過java命令啓動將會是一件極爲繁瑣的事情,緣由很簡單,太 多的依賴讓參數-classpath變得異常的恐怖。爲此,在發佈應用時,通常使用兩種方法來啓動應用程序:一種是經過工具將工程及其全部依賴的jar包 打包成一個獨立的jar包(在maven裏有兩個插件assemly和shade是用來完成這種工做的);另外一種方法是編寫一個run.bat文件,文件 包含一個啓動應用的java命令,很顯然,這個命令的classpath必須包含所有依賴的jar包。可是對於尚處在開發階段的應用來講,第一種方法須要 將全部jar包解壓再從新打包,所以很是耗時,特別是工程很是大的時候。第二種方法的問題在於,對處在開發階段的工程,常常須要引入或升級jar包,這就 須要頻繁地修改run.bat文件。實際上,對於使用maven管理的工程,徹底能夠經過maven來獲取工程的classpath,簡化應用程序的啓動 命令,這正是maven插件exec被設計出來的主要動機。使用exec比使用java命令去啓動應用程序最大的優點就在於:你不須要再去爲-classpath而傷腦筋了。

2. exec:execexec:java的區別

java

exec 主要由兩個goal組成:exec:exec和exec:java。你應該如何選擇呢?首先,你須要記住,exec:exec老是比exec:java強 大而靈活,這一點會在後面的示例中體現出來,除此以外,二者的主要區別是在線程管理上:exec:exec老是啓動一個新的線程,而且在只剩下守護線程的 時候從VM上退出(關閉應用程序)。而對於exec:java,當全部非守護線程結束時,守護線程會被joine或interrupt,應該程序不會關 閉。可是對於通常的使用者來講,這種差異並不重要。對於二者的選擇,通常來講,若是你的工程啓動很是簡單,不須要設置jvm參數、系統屬性、命令行參數, 那麼就用exec:java,你只須要指定一下mainClass,一切就OK了。例如這面這段配置:app

[html] view plaincopyjvm

  1. <plugin>  maven

  2.     <groupId>org.codehaus.mojo</groupId>  工具

  3.     <artifactId>exec-maven-plugin</artifactId>  ui

  4.     <version>1.2.1</version>  spa

  5.     <executions>  .net

  6.         <execution>  插件

  7.             <goals>  

  8.                 <goal>java</goal>  

  9.             </goals>  

  10.         </execution>  

  11.     </executions>  

  12.     <configuration>  

  13.         <mainClass>com.yourcompany.app.Main</mainClass>  

  14.     </configuration>  

  15. </plugin>  


若是偏偏相反,你的應用程序啓動很是複雜,須要設置jvm參數、系統屬性、命令行參數等,那麼你就須要使用exec:exec了,下面咱們看一個exec:exec的「好」「大」「全」示例。

3.一個「好」「大」「全」的例子

假定咱們的應用程序是經過這樣的java命令來啓動的:


java -DsystemProperty1=value1 -DsystemProperty2=value2 -XX:MaxPermSize=256m -classpath .... com.yourcompany.app.Main arg1 arg2


這 個啓動命令前後爲應用程序設置了必要的系統屬性systemProperty1和systemProperty2,而後設置了一個jvm參數,接着是程序 的classpath,....省略的部分就是我不說你也能想到會有多麼冗長的類路徑了,再接下來是程序入口--主類的類名,arg1 arg2是傳給應用程序的命令行參數。


3.1. 在xml中配置:

首先咱們來看一下如何在pom中經過配置來實現這個啓動命令:

[html] view plaincopy

  1. <plugin>  

  2.     <groupId>org.codehaus.mojo</groupId>  

  3.     <artifactId>exec-maven-plugin</artifactId>  

  4.     <version>1.2.1</version>  

  5.     <configuration>  

  6.         <executable>java</executable> <!-- executable指的是要執行什麼樣的命令 -->  

  7.         <arguments>  

  8.             <argument>-DsystemProperty1=value1</argument> <!-- 這是一個系統屬性參數 -->  

  9.             <argument>-DsystemProperty2=value2</argument> <!-- 這是一個系統屬性參數 -->  

  10.             <argument>-XX:MaxPermSize=256m</argument> <!-- 這是一個JVM參數 -->  

  11.             <!--automatically creates the classpath using all project dependencies,   

  12.                 also adding the project build directory -->  

  13.             <argument>-classpath</argument> <!-- 這是classpath屬性,其值就是下面的<classpath/> -->  

  14.             <classpath/> <!-- 這是exec插件最有價值的地方,關於工程的classpath並不須要手動指定,它將由exec自動計算得出 -->  

  15.             <argument>com.yourcompany.app.Main</argument> <!-- 程序入口,主類名稱 -->  

  16.             <argument>arg1</argument> <!-- 程序的第一個命令行參數 -->  

  17.             <argument>arg2</argument> <!-- 程序的第二個命令行參數 -->  

  18.         </arguments>  

  19.     </configuration>  

  20. </plugin>  


將上面的配置加到pom中並保存,而後執行:


mvn exec:exec


便可啓動應用程序了。


3.2. 在命令行中配置:

除寫在pom配置文件中,exec也支持更加靈活的命令行方式來啓動,你能夠在你的pom中只聲明引入了exec插件,不提供任何配置內容,而後在命令行中設置相關參數,一樣以上面的命令爲例,若是使用命令行方式來配置,那麼這個命令將會是:


mvn exec:exec -Dexec.executable="java" -Dexec.args="-DsystemProperty1=value1 -DsystemProperty2=value2 -XX:MaxPermSize=256m -classpath %classpath com.yourcompany.app.Main arg1 arg2"


怎麼樣,是否是看起來更加簡潔?

注意:exec.args指的 是exec:exec的commandlineArgs參數,而咱們上面xml配置中的參數是arguments,二者是不同的,這種作法是比較好的, 由於exec規定:若是有commandlineArgs,將優先使用commandlineArgs,若是沒有再去找是否配置了argument,這樣 給咱們在命令行執行不一樣設定參數的機會。下面是exec官網對此的相關說明:1.If commandLineArgs is specified, it will be used as is, except for replacing %classpath with proper classpath using dependencies2.Otherwise if the property exec.args is specified, it will be used3.Otherwise the list of argument and classpath will be parsed and used

相關文章
相關標籤/搜索