讀古今文學網 > Maven實戰 > 3.4 打包和運行 >

3.4 打包和運行

將項目進行編譯、測試之後,下一個重要步驟就是打包(package)。Hello World的POM中沒有指定打包類型,使用默認打包類型jar。簡單地執行命令mvn clean package進行打包,可以看到如下輸出:

類似地,Maven會在打包之前執行編譯、測試等操作。這裡看到jar:jar任務負責打包,實際上就是jar插件的jar目標將項目主代碼打包成一個名為hello-world-1.0-SNAPSHOT.jar的文件。該文件也位於target/輸出目錄中,它是根據artifact-version.jar規則進行命名的,如有需要,還可以使用finalName來自定義該文件的名稱,這裡暫且不展開,後面會詳細解釋。

至此,我們得到了項目的輸出,如果有需要的話,就可以複製這個jar文件到其他項目的Classpath中從而使用HelloWorld類。但是,如何才能讓其他的Maven項目直接引用這個jar呢?還需要一個安裝的步驟,執行mvn clean install:

在打包之後,又執行了安裝任務install:install。從輸出可以看到該任務將項目輸出的jar安裝到了Maven本地倉庫中,可以打開相應的文件夾看到Hello World項目的pom和jar。之前講述JUnit的POM及jar的下載的時候,我們說只有構件被下載到本地倉庫後,才能由所有Maven項目使用,這裡是同樣的道理,只有將Hello World的構件安裝到本地倉庫之後,其他Maven項目才能使用它。

我們已經體驗了Maven最主要的命令:mvn clean compile、mvn clean test、mvn clean package、mvn clean install。執行test之前是會先執行compile的,執行package之前是會先執行test的,而類似地,install之前會執行package。可以在任何一個Maven項目中執行這些命令,而且我們已經清楚它們是用來做什麼的。

到目前為止,還沒有運行Hello World項目,不要忘了HelloWorld類可是有一個main方法的。默認打包生成的jar是不能夠直接運行的,因為帶有main方法的類信息不會添加到manifest中(打開jar文件中的META-INF/MANIFEST.MF文件,將無法看到Main-Class一行)。為了生成可執行的jar文件,需要借助maven-shade-plugin,配置該插件如下:

plugin元素在POM中的相對位置應該在<project><build><plugins>下面。我們配置了mainClass為com.juvenxu.mvnbook.helloworld.HelloWorld,項目在打包時會將該信息放到MANIFEST中。現在執行mvn clean install,待構建完成之後打開target/目錄,可以看到hello-world-1.0-SNAPSHOT.jar和original-hello-world-1.0-SNAPSHOT.jar,前者是帶有Main-Class信息的可運行jar,後者是原始的jar,打開hello-world-1.0-SNAPSHOT.jar的META-INF/MANIFEST.MF,可以看到它包含這樣一行信息:

現在,在項目根目錄中執行該jar文件:

控制台輸出為Hello Maven,這正是我們所期望的。

本小節介紹了Hello World項目,側重點是Maven而非Java代碼本身,介紹了POM、Maven項目結構以及如何編譯、測試、打包等。