Maven是一個(gè)項(xiàng)目管理的綜合工具。使用 Maven 給我們帶來(lái)的最直接的好處,就是統(tǒng)一管理了jar 包及jar包之間依賴維護(hù),為我們省去了到各個(gè)網(wǎng)站去下載所需的jar包。本篇文章主要講講如何用Maven去構(gòu)建項(xiàng)目。
一、命令行構(gòu)建maven項(xiàng)目
- 打開(kāi)命令控制臺(tái),輸入命令mvn archetype:generate
-
選擇需要?jiǎng)?chuàng)建的模板,默認(rèn)7(普通java項(xiàng)目),10(javaweb項(xiàng)目)
-
輸入groupId,artifactId,version三要素及package
- 回車確認(rèn)后,創(chuàng)建完畢
當(dāng)然也可以一次性命令創(chuàng)建項(xiàng)目
- 創(chuàng)建java項(xiàng)目
mvn archetype:generate -DgroupId={project-packaging} -DartifactId={project-name}
-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
- 創(chuàng)建簡(jiǎn)單web項(xiàng)目
mvn archetype:generate -DgroupId={project-packaging} -DartifactId={project-name}
-DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
二、Eclipse上構(gòu)建maven項(xiàng)目
一般較新版本的Eclipse都會(huì)帶有Maven插件,如何沒(méi)有可點(diǎn)擊Help -> Eclipse Marketplace,搜索maven關(guān)鍵字,安裝如下插件

-
Maven環(huán)境配置:點(diǎn)擊Window -> Preferences->Maven
- New 菜單 Other.. -> Maven -> Maven Project
-
選擇Create a simple project及Use default Workspace location
-
添加項(xiàng)目信息,Finish完成。
三、IDEA上構(gòu)建maven項(xiàng)目
與在eclipse上類似,首先配置好本地的Maven,我這邊直接放圖了。



四、pom.xml配置文件詳解
以下列出了一些比較常用標(biāo)簽及說(shuō)明
<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">
<!-- 模型版本。maven2.0必須是這樣寫(xiě),現(xiàn)在是maven2唯一支持的版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司或者組織的唯一標(biāo)志 -->
<groupId>com.test</groupId>
<!-- 項(xiàng)目的唯一ID,一個(gè)groupId下面可能多個(gè)項(xiàng)目-->
<artifactId>testProject</artifactId>
<!-- 項(xiàng)目的版本號(hào) -->
<version>1.0.0-SNAPSHOT</version>
<!-- 打包類型,如pom,jar, maven-plugin, ejb, war, ear, rar, par,默認(rèn)為jar -->
<packaging>jar</packaging>
<!--項(xiàng)目一些信息,如項(xiàng)目名,描述,項(xiàng)目地址-->
<name>testProject</name>
<description>一個(gè)測(cè)試項(xiàng)目</description>
<url>http://www.test.com/ </url>
<!--父pom配置,子pom可繼承父pom的groupId,version -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<!--設(shè)空值將始終從倉(cāng)庫(kù)中獲取;
查找順序:relativePath元素中的地址–本地倉(cāng)庫(kù)–遠(yuǎn)程倉(cāng)庫(kù)
-->
<relativePath />
</parent>
<!--父pom中,包含的子模塊配置-->
<modules><module>子模塊</module></modules>
<!--項(xiàng)目開(kāi)發(fā)者列表 -->
<developers>
<!--項(xiàng)目開(kāi)發(fā)者的信息,列舉了主要一些標(biāo)簽 -->
<developer>
<!--項(xiàng)目開(kāi)發(fā)者名稱-->
<name> xxxxxx</name>
<!--項(xiàng)目開(kāi)發(fā)者email -->
<email> xxxxxx@163.com</email>
<!--項(xiàng)目開(kāi)發(fā)者URL -->
<url ></url>
<!--項(xiàng)目開(kāi)發(fā)者所屬機(jī)構(gòu) -->
<organization> </organization>
</developer>
</developers>
<!--列出項(xiàng)目協(xié)議-->
<licenses>
<license>
<!--license名稱 -->
<name>MIT</name>
<!--官方的license正文頁(yè)面的URL -->
<url></url>
<!--關(guān)于license的補(bǔ)充信息 -->
<comments> </comments>
</license>
</licenses>
<!-- 為pom定義一些常量,在pom中的其它地方可以直接引用 -->
<properties>
<file.encoding>UTF-8</file.encoding>
<java.version>1.8</java.version>
<commons.io.version>2.5</commons.io.version>
</properties>
<!--dependencyManagement
父pom可以用來(lái)統(tǒng)一管理子模塊的依賴jar包;
子pom可以用來(lái)引入父pom
-->
<dependencyManagement>
<dependencies>
........
<!--子pom通過(guò)非繼承的方式來(lái)引入pom,可以多個(gè);而parent的方式只能一個(gè)-->
<dependency>
<groupId>com.test</groupId>
<artifactid>project_parent1</artifactId>
<version>1.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 定義項(xiàng)目的jar依賴關(guān)系 -->
<dependencies>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version></version>
<!--范圍選擇,默認(rèn)compile:編譯,運(yùn)行,測(cè)試 有效
provided:編譯,測(cè)試 有效,不含在打包中
test:測(cè)試 有效
runtime:運(yùn)行,測(cè)試 有效
system:倉(cāng)庫(kù)之外的類庫(kù);編譯,測(cè)試 有效
-->
<scope>compile</scope>
<systemPath>配合 scope=system時(shí)使用</systemPath>
<!-- 設(shè)置依賴是否可選,默認(rèn)為false,
如果為true時(shí),其它項(xiàng)目依賴該項(xiàng)目時(shí),需要 quartz時(shí),需寫(xiě)明
dependency依賴-->
<optional>false</optional>
<!-- 排除依賴關(guān)系。禁止c3p0導(dǎo)入-->
<exclusions>
<exclusion>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!--構(gòu)建配置-->
<build>
<!-- 產(chǎn)生的構(gòu)件的文件名,默認(rèn)值是${project.artifactId}-${project.version}。 -->
<finalName>${project.artifactId}</finalName>
<!-- 構(gòu)建產(chǎn)生的所有文件存放的目錄,默認(rèn)為${basedir}/target,即項(xiàng)目根目錄下的target -->
<directory>${basedir}/target</directory>
<!--插件列表-->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>..</version>
<executions>
<!--插件與maven生命周期階段綁定配置-->
<execution>
<id>att-sources</id>
<!--階段名,如:compile,package等-->
<phase>package</phase>
<!--插件需要執(zhí)行的目標(biāo)-->
<goals>
<goal></goal>
</goals>
</execution>
</executions>
<!--插件參數(shù)配置-->
<configuration>
</configuration>
<!--項(xiàng)目引入插件所需要的額外依賴 -->
<dependencies>
<dependency>...</dependency>
</dependencies>
</plugin>
</plugins>
</build>
<!--遠(yuǎn)程庫(kù)配置,可能需要引入一些特殊jar-->
<repositories>
<repository>
<id>public</id>
<name>aliyun nexus</name>
<!--遠(yuǎn)程庫(kù)地址-->
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<!--開(kāi)啟發(fā)布版本的下載-->
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<!-- 插件遠(yuǎn)程庫(kù) -->
<pluginRepositories>
<pluginRepository>
<id>public</id>
<name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<!--開(kāi)啟發(fā)布版本的下載-->
<releases>
<enabled>true</enabled>
</releases>
<!--關(guān)閉快照的下載-->
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
依賴范圍
| scope | 編譯 | 測(cè)試 | 運(yùn)行 |
|---|---|---|---|
| compile | Y | Y | Y |
| test | Y | ||
| provided | Y | Y | |
| runtime | Y | Y | |
| system | Y | Y |
依賴傳遞性
比如有a,b,c三個(gè)jar包或項(xiàng)目,a依賴b,b依賴c,而c對(duì)于a來(lái)說(shuō)是傳遞性依賴。傳遞依賴受依賴范圍限制。下表中第一列代表a對(duì)b的依賴,第一行代表b對(duì)c的依賴。則a對(duì)于c的依賴范圍如下表所示,為空則不依賴。
| compile | test | provided | runtime | |
|---|---|---|---|---|
| compile | compile | runtime | ||
| test | test | test | ||
| provided | provided | provided | provided | |
| runtime | runtime | runtime |
五、Maven打包命令
主要有三個(gè)打包命令mvn package、mvn install、mvn deploy。當(dāng)然一般打包之前都會(huì)先清理一下。
- mvn clean package:完成了清理、項(xiàng)目編譯、單元測(cè)試、打包功能。
- mvn clean install:完成了清理、項(xiàng)目編譯、單元測(cè)試、打包及布署到本地maven倉(cāng)庫(kù)功能。
- mvn clean deploy:完成了清理、項(xiàng)目編譯、單元測(cè)試、打包及布署到本地maven倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)功能。
參考資料
pom.xml配置文件詳解




