maven一波流(3)——使用eclipse構建第一個maven工程
概述
傳統工程中,jar包需要自己拷貝到專案裡面來,然後專案編譯的時候可以訪問到這些jar包,完成專案的構建工作。
但是maven專案則不同,實際上專案目錄下是沒有jar包的。maven工程對專案的結構是有特殊要求的,比如至少得有一個配置檔案,告訴工程需要引用那些 jar包。這些jar包會自動從中央倉庫下載到本地倉庫,並參與專案的構建。
本文通過一個具體的例項瞭解maven專案結構與傳統專案的不同,也瞭解下maven專案構建方式與傳統方式的不同。
新建maven專案
1、File-New-Other-Maven-Maven Project-Next
2、在New Maven Project介面直接Next
3、在Select An Archetype介面,Archetype的意思是原型,所謂原型可以理解為模版,就是有一些結構不用咱們一個個去寫,系統自動生成。此處我們選個簡單的maven-archetype-quickstart,這個原型會幫我們生成maven工程基本結構,然後Next。
4、輸入工程的資訊:
Group Id:com.panda
Artifact Id:mvndemo
Version:0.0.1-SNAPSHOT
Package:com.panda.mvndemo
注意Package是輸入Group Id和Artifact Id後自動生成的,可以理解Artifact Id是專案名,Group Id是組織機構名,此處組織機構就是個人panda了。
5、點選Finish,注意eclipse右下角有進度條,然後專案中的目錄檔案一直在增加,這是maven幫我們根據原型自動構建專案的過程。
專案目錄結構分析
根據maven-archetype-quickstart模型自動生成的專案目錄結構如下:
- mvndemo:專案
- src/main/java:業務程式碼
- src/test/java:測試程式碼
- JRE System Library:JRE庫,此處引用了JDK1.8
- Maven Dependencies:Maven依賴庫,此處引入了由pom.xml指定的junit-3.8.1.jar
- junit-3.8.1.jar
- src:可以從檔案結構看到業務程式碼和測試程式碼,一般不用開啟看。
- target:暫時不用
- pom.xml:定義maven配置資訊
都很好理解,唯一需要正視的就是pom.xml,它定義了maven專案的依賴jar包情況,具體分析下:
<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>com.panda</groupId>
<artifactId>mvndemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mvndemo</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 配置專案依賴的jar包 -->
<dependencies>
<!-- 一個依賴 -->
<dependency>
<!-- 通過groupId、artifactId、version唯一定位一個jar包,所以這是一個座標 -->
<!-- 該座標指定的junit-3.8.1.jar被自動放入Maven Dependencies依賴庫中,程式構建時可以使用該jar -->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
maven專案的構建
正常專案匯入jar包,編輯完程式碼,可以進行測試和打包安裝了。maven專案需要通過maven來執行這個過程,主要包括:清理、測試、打包。
清理
右鍵點選專案名稱-Run as-Maven clean,執行清理操作,控制檯輸出關鍵資訊如下:
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ mvndemo ---
[INFO] Deleting D:WorkspaceEclipsePhotonmvndemo arget
[INFO] Total time: 0.199 s
[INFO] Finished at: 2018-09-07T16:39:35+08:00
可以看出幾點:
- eclipse選單Maven clean點選後實際上應該是呼叫maven完成的maven-clean清理操作
- 清理操作應該是刪除target目錄下生成的一些東西
- 在0.199s內完成了清理操作
總結來說,maven專案需要先清理下,否則可能因為之前生成的東西影響新的生成。
測試
右鍵點選專案名稱-Run as-Maven test,執行測試操作,控制檯輸出關鍵資訊如下:
Running com.panda.mvndemo.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 sec
可以看出幾點:(如果對單元測試不熟悉的,建議去稍微瞭解下)
- 執行了AppTest測試類,該類因為繼承了TestCase,而TestCase實現了junit框架下的Test介面實現了單元測試功能
- 可以推測出,當執行Maven test測試操作時,maven會自動呼叫src/test/java下面的測試類的測試方法。因為我們已經在pom.xml配置了junit,所以此處能識別並呼叫junit單元測試方法。
- 測試方法程式碼如下,因為
assertTrue( true );
肯定斷言成功,所以最後測試結果是run:1個,沒有失敗和錯誤。
public void testApp()
{
assertTrue( true );
}
打包安裝
右鍵點選專案名稱-Run as-Maven install,執行安裝操作,控制檯輸出關鍵資訊如下:
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ mvndemo ---
[INFO] Building jar: D:WorkspaceEclipsePhotonmvndemo argetmvndemo-0.0.1-SNAPSHOT.jar
可以看出,在target目錄下生成了一個mvndemo-0.0.1-SNAPSHOT.jar。
執行程式
我們使用命令執行mvndemo-0.0.1-SNAPSHOT.jar
首先在D:WorkspaceEclipsePhotonmvndemo arget
目錄新建mvndemo.bat指令碼,用於在windows平臺呼叫java執行生成的 mvndemo-0.0.1-SNAPSHOT.jar。
mvndemo.bat指令碼檔案內容如下:
java -jar mvndemo-0.0.1-SNAPSHOT.jar
pause
執行後如下,可見需要配置程式的入口。
D:WorkspaceEclipsePhotonmvndemo arget>java -jar mvndemo-0.0.1-SNAPSHOT.jar
mvndemo-0.0.1-SNAPSHOT.jar中沒有主清單屬性
可想而知maven程式的入口必然是在pom.xml中配置,我們在pom.xml中為project根節點增加一個build節點如下:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!-- 此處指定入口類 -->
<mainClass>com.panda.mvndemo.App</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
所以此時就會呼叫入口類:com.panda.mvndemo.App,這個是自動生成的,程式碼如下:
public class App
{
public static void main( String[] args ) throws InterruptedException
{
System.out.println( "Hello World!" );
}
}
OK,重新清理、生成,呼叫mvndemo.bat後:
D:WorkspaceEclipsePhotonmvndemo arget>java -jar mvndemo-0.0.1-SNAPSHOT.jar
Hello World!
OK ,大功告成,厲害炸了。
總結與補充
使用maven後,實際上對整個專案的管理,不論是程式碼結構目錄,還是編譯生成執行方式,實際上都變了。
但是都是很合理按照需求發生的變化,我們熟悉一下,也就順理成章的用就行了。
另補充下,其實不用eclipse,直接執行mvn命令也能完成整個專案的構建、生成,就像java程式也可以直接用java命令列生成一樣。有興趣的可以去了解下,有助於加深對maven的理解,當然不去看也OK,反正我也沒看。