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:exec和exec: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
<plugin> maven
<groupId>org.codehaus.mojo</groupId> 工具
<artifactId>exec-maven-plugin</artifactId> ui
<version>1.2.1</version> spa
<executions> .net
<execution> 插件
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>com.yourcompany.app.Main</mainClass>
</configuration>
</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
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<executable>java</executable> <!-- executable指的是要執行什麼樣的命令 -->
<arguments>
<argument>-DsystemProperty1=value1</argument> <!-- 這是一個系統屬性參數 -->
<argument>-DsystemProperty2=value2</argument> <!-- 這是一個系統屬性參數 -->
<argument>-XX:MaxPermSize=256m</argument> <!-- 這是一個JVM參數 -->
<!--automatically creates the classpath using all project dependencies,
also adding the project build directory -->
<argument>-classpath</argument> <!-- 這是classpath屬性,其值就是下面的<classpath/> -->
<classpath/> <!-- 這是exec插件最有價值的地方,關於工程的classpath並不須要手動指定,它將由exec自動計算得出 -->
<argument>com.yourcompany.app.Main</argument> <!-- 程序入口,主類名稱 -->
<argument>arg1</argument> <!-- 程序的第一個命令行參數 -->
<argument>arg2</argument> <!-- 程序的第二個命令行參數 -->
</arguments>
</configuration>
</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