如果是初用Maven的小夥伴,就會覺得它和.NET中的Nuget很像,用來管理項目中的包依賴,畢竟Java依賴包浩如煙海,沒個包管理器,簡直是噩夢,當然Maven的作用不止如此,他提供了:
- 依賴管理:Maven的核心功能,讓開發者可以通過pom.xml來管理項目所需的庫和框架,就按照Nuget來理解就行;
- 項目構建:提供了一套完整的構建機制,可以自動完成項目的編譯、測試、打包、部署等操作,功能類似於MSBuild,通過配置POM文件就可以輕鬆實現;
- 模塊管理:Maven提供了多模塊的管理,可以允許開發者在一個項目中包含多個子模塊,類似於.NET中的解決方案和.csproj等功能的集合體;
- 標準化管理:Maven提供了標準化的項目結構,便於團隊管理。
管他啥功能,別人都在用,我也用,用多了自然知道是幹啥的了。
Maven配置
大家可以去官網上下載最新版本,我本地已經有了3.6.2的版本了,就不再額外安裝了。
配置環境變量
- 在環境變量中添加“maven_home”,路徑爲maven的安裝路徑,本人的安裝路徑爲
D:\DevSoft\maven_3.6.2
; - 在Path中添加
%maven_home%\bin\
,點擊確認; - 打開命令行,輸入
mvn -v
驗證是否配置成功;
本地配置
打開maven目錄,找到conf,打開settings.xml,找到localRepository
,不要用c盤,畢竟作爲一名開發,c盤真的不富裕,把本地倉庫位置挪走。
<localRepository>D:\\Repository\\Maven</localRepository>
由於某些原因,mvn更新包的速度會很慢,建議使用阿里雲的鏡像,一樣是在settings.xml的mirrors節點下添加:
<!-- 阿里雲倉庫 -->
<mirros>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
<!-- 中央倉庫1 -->
<mirror>
<id>repo1</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo1.maven.org/maven2/</url>
</mirror>
<!-- 中央倉庫2 -->
<mirror>
<id>repo2</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo2.maven.org/maven2/</url>
</mirror>
</mirros>
Idea設置
Idea中也要進行一些簡單設置,在文件->設置->構建->Maven中,按自己的情況配置Maven地址和配置文件。
別上來就整mvn archetype:generate ***
之類的來創建項目,放着打火機不用,非要自己鑽木取火,Idea:文件->新建->項目調出項目創建界面:
因爲是maven項目,構建系統直接選擇maven,JDK選擇本地安裝的1.8版本,這裏的名稱類似於.NET中的解決方案名稱,不同的是,這個解決方案也可以是一個項目,高級設置中有一個組Id和工件Id,分別對應pom文件中的groupId和artifactId(這裏我覺得沒必要翻譯,用中文反而差點意思),groupid一般就是公司網址的反寫+項目名稱,這裏瞎寫了一個:com.lmmplat.net2java
,artifactid你可以理解爲是項目名,一般就是項目名+模塊名,到這裏,一個簡單的Maven項目就創建完成了。
POM文件
上圖中我們看到了項目中存在一個pom.xml
文件,pom是maven中核心文件,包含項目的基本信息,主要用於表述項目如何構建、聲明依賴等:
<?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.lmmplat.net2java</groupId>
<artifactId>lmmplat</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
一個完整的pom文件至少包含一個project根和groupId、artifactId、version三個元素,groupId前文中也表述過,一般來說就是公司網址的反寫+項目名稱,最好是唯一的;artifactId是工程標識,通常就是項目名稱+模塊名稱,比如llmplat-api、llmplat-core等;version就是工程的版本號。這個文件看起來簡單,實際上是以爲它默認繼承了一個Super pom,maven使用Super pom加項目pom來執行,我們可以通過mvn help:effective-pom
來查看實際生效的pom。
POM詳解
POM的全程爲Project Object Model,是整個項目的描述未見,定義了項目構建、依賴管理以及其他相關的配置信息,學習Maven可以說就是學習如何配置POM,下面我會挑選最常用的一些內容進行講解:
- 項目描述:
- groupId:組織的唯一標識,一般是公司域名反寫+項目名
- artifactId:項目內的唯一表示,一般是項目名+模塊名
- version:版本號,值得一提的是
1.0-SNAPSHOT
中的snapshot,這個一般表示該版本尚不穩定 - description:項目描述,當然還有name、url等屬性,一般都是用來生成文檔
- packaging:文件的打包類型,有pom、jar、war等,pom類型表示該項目是一個聚合項目或父項目,多用於組織和協調項目模塊
- modelVersion:描述項目遵循哪一個pom模型
- properties:用於定義後續配置中用到的變量,多用於版本號的統一管理,如
<slf4j.version>1.7.36<slf4j.version>
,在後面的依賴管理中就可以統一用${slf4j.version}
來替代,便於版本的管理和統一 - parent:parent元素一般表示一個項目繼承自另外一個maven項目,通常用於多模塊的maven項目結構,好處是子模塊可以繼承父模塊的配置,易於整個項目統一維護
<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/maven-v4_0_0.xsd ">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.lmmplat.net2java</groupId>
<artifactId>lmmplat</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>lmmplat-api</artifactId>
</project>
- 構建配置:
- build:定義項目如何構建
- plugins:定義要使用的插件
- 依賴管理:
- dependencies:項目依賴配置,指定項目所需的依賴
- dependencyManagement:集中管理多個模塊的依賴,比如在父項目中統一指定依賴的版本號,子模塊只需要引用依賴即可
- 模塊管理:
- modules:主要針對多模塊項目,指定包含的子模塊,多是在父項目中使用
- 倉庫管理:
- repositories:定義項目中使用的遠程倉庫地址
- pluginRepositories:定義項目中使用的插件倉庫地址
- 配置管理
- profiles:爲項目定義不同的構建環境或集合配置。
實際上Maven的功能不止如此,但對於大多數開發者來說,上面的功能已經足夠使用了。
<?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">
<!--描述項目遵循那個POM模型,必須,基本不需要懂-->
<modelVersion>4.0.0</modelVersion>
<!--組織的唯一標識,一般是公司域名反寫+項目名-->
<groupId>com.lmmplat.net2java</groupId>
<!--項目內的唯一表示,一般是項目名+模塊名-->
<artifactId>lmmplat</artifactId>
<!--版本號-->
<version>1.0-SNAPSHOT</version>
<!--項目的打包類型:pom、jar、war等-->
<packaging>pom</packaging>
<!--項目的詳細描述-->
<description>這是一個示例項目</description>
<!--聲明所依賴的外部庫或組件-->
<dependencies>
<!--引入了slf4j的依賴-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
</dependencies>
<!--用於配置項目構建相關信息-->
<build>
<plugins>
<!--插件:下面這個插件能夠將spring boot應用打包爲可執行的jar或war文件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<mainClass>com.lmmplat.net2java.Main</mainClass>
<layout>ZIP</layout>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!--遠程倉庫配置-->
<repositories>
<!--比如有時候你需要用到自己搭建的私有倉庫-->
<repository>
<id>central</id>
<name>lmmplat中央倉庫</name>
<!--地址我瞎寫的,lmm最近比較火-->
<url>https://repo.maven.lmmplat.cn/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<!--模塊信息描述-->
<modules>
<!--子項目相對路徑-->
<module>lmmplat-api</module>
</modules>
<!--自定義變量-->
<properties>
<!--自定義了一個名爲sl4j.version的變量,用於後續替代sl4j的版本依賴-->
<slf4j.version>1.7.32</slf4j.version>
</properties>
</project>
Archetype
如果你用Idea新建項目可以發現一個MavenArchetype選項,這個就是Maven工程模板了,類似於VS新建項目裏的項目模板,比如org.apache.maven.archetypes:maven-archetype-webapp
就可以對標一下VS裏的ASP.NET Core Web應用
,可以幫助你快速構建應用,下面列一些比較常用的MavenArchetype,一般我都是直接通過maven-archetype-quickstart
創建項目,再通過修改pom來調整項目,比如我想創建一個Spring Boot項目,我們可以先創建一個quickstart項目,然後通過在pom.xml中添加Spring Boot依賴:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.3</version>
</dependency>
<!-- 添加其他需要的Spring Boot Starters -->
</dependencies>
然後添加一個Application類
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
一個Spring Boot項目就創建完成了。
生命週期
一個項目從構建到發佈,Maven爲期定義了一個完整的聲明週期,點開Idea界面右側邊欄的m圖標,就可以看見一個大概的生命週期:
階段 | 操作 | 描述 |
---|---|---|
clean | 清理 | 通常在構建之前執行,用於刪除target中的輸出文件,從頭開始,未必不是一件好事 |
validate | 驗證 | 驗證項目的正確性 |
compile | 編譯 | 編譯項目 |
test | 測試 | 運行單元測試 |
package | 打包 | 將編譯後的文件打包成目標格式,如jar或war |
verify | 檢查 | 檢查集成測試的結果,保證質量達標 |
install | 安裝 | 安裝打包的項目到本地倉庫,供其他項目使用 |
site | 站點 | 生成項目文檔和站點信息mvn |
deploy | 部署 | 將打包好的項目報拷貝到遠程倉庫(我看就沒有這個必要了吧) |
工作中比較常用的就是mvn clean
、mvn compile
、mvn package
、mvn install
幾個命令,當我們進行操作是,只有該階段及該階段之前的命令會被調用,如我使用mvn install
,那clean->validate->compile->test->package->versify->install會執行,而之後不會被執行。當然mvn的生命週期的控制可以更爲精細,但我們絕大多數的時候並不需要用到這些功能,如果需要,再去細化研究。