但是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
1
2
3
4
注意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後:
Hello World!
OK ,大功告成,厲害炸了。
總結與補充
使用maven後,實際上對整個項目的管理,不論是代碼結構目錄,還是編譯生成運作方式,實際上都變了。
但是都是很合理按照需求發生的變化,我們熟悉一下,也就順理成章的用就行了。
另補充下,其實不用eclipse,直接執行mvn指令也能完成整個項目的建構、生成,就像java程式也可以直接用java指令行生成一樣。有興趣的可以去了解下,有助于加深對maven的了解,當然不去看也OK,反正我也沒看。