這又是一個系列,一個要把Maven講透的系列,但願可以對你們有幫助!
說到Maven的入門使用,實際上是特別簡單的,若是隻是說就是能使用,會使用Maven,也許只要短短的一兩個小時就OK了,不須要去理解Maven的那些概念,而這篇文章就是要教會你會使用Maven,而整個系列則是要讓你明白整個Maven。這篇文章就是如此,僅僅就是告訴你怎麼用Maven,僅此而已,會用是學習整個系列的前提。html
就像composer的composer.json、Make的makefile文件同樣,Maven項目的核心是pom.xml文件。POM(Project Object Model,項目對象模型)定義了項目的基本信息,用於描述項目如何構建,聲明項目依賴,等等。java
如今咱們不借助任何其它命令和IDE,來建立一個Maven項目。apache
首先,編寫pom.xml文件。仍是按照老規矩,從一個Hello World項目進行演示。如下就是建立項目的POM文件。json
<?xml version="1.0" encoding="UTF-8"?> <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.jellythink.HelloWorld</groupId> <artifactId>hello-world</artifactId> <version>1.0-SNAPSHOT</version> <name>hello-world</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> </project>
對於POM文件,如今細說一下。微信
project
元素,project
是全部pom.xml的根元素,它還聲明瞭一些POM相關的命名空間及xsd元素;modelVersion
指定了當前POM模型的版本,對於Maven 2和Maven 3來講,它只能是4.0.0;groupId
、artifactId
和version
了,這三個是上述代碼三個元素。這三個元素定義了一個項目的基本座標,在Maven的世界裏,全部的jar和war都是基於座標進行區分的,會面的文章還會細說座標;groupId
定義了項目屬於哪一個組,這個組每每和項目所在的組織或公司存在關聯,通常是使用組織或公司的域名;好比上面的groupId
是com.jellythink.HelloWorld
,其中com.jellythink
就是個人網站域名倒過來寫的,而HelloWorld
則是整個項目的名稱;artifactId
定義了當前Maven項目在組中惟一的ID,通常一個大項目組下面可能會包含多個子項目或子模塊,而這個artifactId
就是子項目或者子模塊的名稱;version
指定了這個項目當前的版本,後面的文章還會細說Maven中版本的含義;name
元素聲明瞭一個對於用戶更爲友好的項目名稱,方便後期的管理;properties
指定了Maven的一些重要屬性,後續還會重點說這個屬性的一些配置。建立完pom.xml文件後,接下來就是建立代碼文件了。在Maven中,有這樣的一個約定,項目主代碼都位於src/main/java
目錄,項目測試代碼都位於src/test/java
目錄;接下來咱們先按照這個約定分別建立目錄,而後在代碼目錄建立com/jellythink/HelloWorld/App.java
文件;在測試目錄建立com/jellythink/HelloWorld/AppTest.java
文件。app
仍是老規矩,咱們在App.java
中打印Hello World!,代碼以下:composer
public class App { public String sayHello() { return "Hello World"; } public static void main( String[] args ) { System.out.println(new App().sayHello()); } }
同理,對於AppTest.java
中編寫如下單元測試代碼:maven
public class AppTest { @Test public void testSayHello() { App app = new App(); String result = app.sayHello(); assertEquals("Hello World", result); } }
在Java中,咱們進行單元測試時,基本上都是使用的JUnit,要使用JUnit這個包,咱們就須要引入這個依賴包,此時,咱們就須要在pom.xml中添加如下依賴內容:單元測試
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies>
代碼中添加了dependencies
元素,該元素下能夠包含多個dependency
元素以聲明項目的依賴。前面也說過,groupId
、artifactId
和version
是任何一個Maven項目最基本的座標,JUnit也不例外;scope
表示依賴範圍,後續的文章還會細說這個依賴和測試相關的內容。學習
萬事俱備,只欠東風。接下來咱們編譯和測試。
搞定代碼後,使用Maven進行編譯,在項目根目錄下運行mvn clean compile
命令。執行輸出以下圖所示:
clean
告訴Maven清理輸出目錄target,compile
告訴Maven編譯項目主代碼。從輸出中看到Maven首先執行了clean:clean
任務,刪除target目錄。默認狀況下,Maven構建的全部輸出都在target目錄中;接着執行resources:resources
任務;最後執行compiler:compile
任務,將項目主代碼編譯至target/classes目錄。
上面說到的clean:clean
、resources:resources
和compiler:compile
都對應了Maven的生命週期及插件,這個在後面還會有專題文章細說。
編譯完成後,咱們通常都會運行測試代碼進行單元測試,雖然不少狀況下,咱們並無這麼作,可是我仍是建議你們經過Maven作一些自動化的單元測試。
測試用例編寫完畢以後就能夠調用Maven執行測試,運行mvn clean test
命令,輸出以下:
從輸出能夠看到,Maven依次執行了clean:clean
、resources:resources
、compiler:compile
、resources:testResources
、compiler:testCompile
和surefire:test
。現階段,咱們須要明白這是Maven的生命週期的一個特性,這個生命週期後續還會細說。
到此,編譯和測試均經過了,接着咱們進行應用打包和運行。
打包就是將咱們編寫的應用打成JAR包或者WAR包。在咱們的HelloWorld示例程序POM中,並無指定打包類型,Maven則默認打包成JAR包。咱們執行mvn clean package
命令就能夠完成打包。mvn clean package
命令的輸出以下:
能夠看到,Maven在打包以前會執行編譯、測試等操做,最後經過jar:jar
任務負責打包。實際上就是jar插件的jar目標將項目主代碼打包成一個名爲hello-world-1.0-SNAPSHOT.jar的文件,這個最終生成的包會保存在target目錄下,它是根據artifact-version.jar規則進行命名的;固然了,咱們可使用finalName屬性來自定義該文件的名稱。
到如今,咱們獲得了這個JAR包,若是別的項目要引用這個JAR包時,咱們將這個JAR包複製到其它項目的classpath中就OK了。可是這樣拷貝就違背了咱們當初想要自動解決依賴的問題,因此如何才能讓其它的Maven項目直接引用這個JAR包呢?咱們須要執行mvn clean install
命令。
從輸出能夠看到,在打包以後,又執行了安裝任務install:install
,最後將項目輸出的JAR包安裝到了Maven本地倉庫中,咱們能夠在本地的倉庫文件夾中能看到這個示例項目的pom和jar包。
到目前爲止,經過這個示例項目體驗了mvn clean compile
、mvn clean test
、mvn clean package
和mvn clean install
。執行test以前會先執行compile的,執行package以前會先執行test的,而相似地,install以前會執行package。咱們能夠在任何一個Maven項目中執行這些命令。
最後,不要忘了,咱們生成的JAR包是有main方法的,也就是說這個JAR包是能夠單獨運行的;可是,因爲帶有main方法的類信息沒有添加到manifest中,因此默認打包生成的jar是不可以直接運行的(使用jd-gui打開jar文件中的META-INF/MANIFEST.MF文件,將沒法看到Main-Class一行)。爲了生成可執行jar文件,須要藉助Apache Maven Shade Plugin來完成,咱們須要在pom.xml文件中如下插件配置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.jellythink.HelloWorld.App</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
接下來,咱們再執行mvn clean install
命令,待構建完成以後在target目錄下能夠看到hello-world-1.0-SNAPSHOT.jar和original-hello-world-1.0-SNAPSHOT.jar,前面的是帶有Main-Class信息的可運行jar,後者是原始的jar。咱們執行如下命令:
java -jar hello-world-1.0-SNAPSHOT.jar
就能夠正常執行。
上面很是詳細的總結了如何全手動的建立一個Maven工程。經過上面的總結,咱們大致能夠總結如下幾步:
src/main/java
目錄,並在該目錄開發項目主代碼;src/test/java
目錄,並在該目錄開發項目測試代碼;上面的三步咱們成爲Maven項目的骨架,也就是如今常說的「腳手架」。若是咱們每建立一個Maven項目都須要把上面的步驟執行一次,確實很麻煩,那怎麼辦?程序就是解放人工的,讓人來偷懶的。因此,在Maven中,咱們能夠經過Archetype生成項目骨架,將上面的步驟流程化。好比,如今咱們要建立一個Maven項目,咱們只須要輸入如下命令就OK了。
mvn archetype:generate
執行這個命令後,後看到不少輸出,有不少可用的Archetype供咱們選擇,每個Archetype前面都會對應有一個編號,咱們根據咱們的須要,選擇咱們對應的骨架來建立項目就行了。而後再按照提示,輸出新項目的groupId、artifactId、version和包名package,一個Maven項目就建立成功了。
咱們在運行mvn archetype:generate
時,其實是在運行maven-archetype-plugin
插件。
到此,這篇關於Maven的初級入門文章就到此總結完畢,這篇文章的知識點比較多,並且還很雜,若是看的有點不是很懂,也沒有關係,後續的文章都會對這些你不懂的地方,你不熟悉的地方在進行深刻的剖析和總結。固然了,也但願你們能經過這篇文章對Maven的使用有一個總體的認識,至少沒有後續的文章,經過這篇文章,你也應該知道怎麼使用Maven了,不是嗎?
這一晚上,深深的自責中......
果凍想,認真玩技術的地方。
2019年4月1日,於內蒙古呼和浩特。