1. 程式人生 > >Exec Maven Plugin全面解析和使用示例

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

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

本文原文連線: http://blog.csdn.net/bluishglc/article/details/7622286 ,轉載請註明出處!


1.為什麼使用exec?


現在的工程往往依賴眾多的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 的區別

exec主要由兩個goal組成:exec:exec和exec:java。你應該如何選擇呢?首先,你需要記住,exec:exec總是比exec:java強大而靈活,這一點會在後面的示例中體現出來,除此之外,兩者的主要區別是線上程管理上:exec:exec總是啟動一個新的執行緒,並且在只剩下守護執行緒的時候從VM上退出(關閉應用程式)。而對於exec:java,當所有非守護執行緒結束時,守護執行緒會被joine或interrupt,應該程式不會關閉。但是對於一般的使用者來說,這種差別並不重要。對於兩者的選擇,一般來說,如果你的工程啟動非常簡單,不需要設定jvm引數、系統屬性、命令列引數,那麼就用exec:java,你只需要指定一下mainClass,一切就OK了。例如這面這段配置:

 <plugin>  <groupId>org.codehaus.mojo</groupId>  <artifactId>exec-maven-plugin</artifactId>  <version>1.2.1</version>  <executions>   <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中通過配置來實現這個啟動命令:

 <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 dependencies
2.Otherwise if the property exec.args is specified, it will be used
3.Otherwise the list of argument and classpath will be parsed and used


           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述