28

想自学 Maven?推荐 Maven 极简高速入门及常规使用

 3 years ago
source link: https://mp.weixin.qq.com/s/LWpJVy3ot5btzSqtvSUi8g
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

bqiA3an.jpg!mobile

公众号[JavaQ]原创,专注分享Java基础原理分析、实战技术、微服务架构、分布式系统构建,诚邀点赞关注!

前言

笔者的工作经历中使用过Ant、Maven和Gradle,如果让笔者选择,笔者会首选Gradle。那为什么还要写Maven这篇内容呢?时下大部分公司都还在使用Maven,并且很多开源项目也在使用Maven,Maven有一些功能特性还是很不错的,很值得做总结记录。

Maven是什么

Maven是Apache旗下的一个纯Java开发的开源项目,是一个用于构建和管理任何基于Java的项目的工具。

为什么要使用Maven

使用Maven轻松实现项目jar包依赖管理、子模块管理、构建jar/war包、管理jar/war包、执行单元/集成测试、执行代码分析/代码质量检查等等,开箱即用让开发者无需花更多的时间。

Maven安装

安装Maven之前,需要确保安装了JDK,Maven3.3+版本需要安装JDK 1.7或更高版本。Apache Maven 3.6.3是当前推荐安装的最新版本,推荐使用国内镜像地址下载(https://mirrors.tuna.tsinghua.edu.cn/apache/)。

Windows系统安装及设置

下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/

eqee2mF.png!mobile

windows操作系统下载apache-maven-3.6.3-bin.zip,解压压缩包到硬盘的某个路径,例如:D:\Maven\apache-maven-3.6.3,右键"计算机"(或我的电脑),选择"属性",点击"高级系统设置",点击"环境变量",新建系统变量 MAVEN_HOME,变量值为D:\Maven\apache-maven-3.6.3,编辑系统变量Path,在变量值得末尾加上;%MAVEN_HOME%\bin,保存如上修改退出。

打开命令行窗口(快捷键win+r,输入cmd回车),输入mvn –v回车,如果正常输出Maven版本号则安装及配置完成,否则安装上述步骤检查。

Linux系统安装及设置

Linux系统下载apache-maven-3.6.3-bin.tar.gz,通过如下命令行操作下载及解压,例如解压到/usr/local/路径:

wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz

tar -xvf apache-maven-3.6.3-bin.tar.gz

sudo mv -f apache-maven-3.6.3/usr/local/

使用如下命令行操作打开/etc/profile:

sudo vim /etc/profile

在文件末尾添加如下配置:

export MAVEN_HOME=/usr/local/apache-maven-3.6.3

export PATH=${PATH}:${MAVEN_HOME}/bin

退出编辑并保存,运行如下命令使配置的环境变量生效:

source /etc/profile

在命令行窗口输入mvn –v命令检查安装及设置是否完成,如果正常输出Maven版本号则安装及配置完成,否则安装上述步骤检查。

Mac系统安装及设置

Mac系统下载apache-maven-3.6.3-bin.tar.gz,通过如下命令行操作下载及解压,例如解压到/usr/local/路径:

curl -O https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz

tar -xvf apache-maven-3.6.3-bin.tar.gz

sudo mv -f apache-maven-3.6.3/usr/local/

使用如下命令行操作打开/etc/profile:

sudo vim /etc/profile

在文件末尾添加如下配置:

export MAVEN_HOME=/usr/local/apache-maven-3.6.3

export PATH=${PATH}:${MAVEN_HOME}/bin

退出编辑并保存,运行如下命令使配置的环境变量生效:

source /etc/profile

在命令行窗口输入mvn –v命令检查安装及设置是否完成,如果正常输出Maven版本号则安装及配置完成,否则安装上述步骤检查。

如何使用Maven

Maven是一个庞大的项目,有很全面的管理功能,本篇内容只记录开发者日常使用频率比较高的部分功能。

设置Maven仓库

Maven仓库就是一个位置,用于存储项目中的依赖,这个依赖可以是jar、war、zip、pom等。

Maven仓库有三种类型:本地仓库、中央仓库和远程仓库。当执行Maven构建命令查找项目依赖时,首先从本地仓库搜索,如果本地仓库找不到,再从中央仓库搜索,如果中央仓库也找不到,又配置过远程仓库,那么再从远程仓库搜索。

本地仓库是计算机本机硬盘上的某个路径,这个路径在安装Maven后不会马上创建,它在第一次运行Maven命令的时候才被创建。默认情况下,本地仓库被创建后,这个路径是用户目录下.m2/repository/,例如Windows系统是C:\Users\admin.m2\repository,Linux系统是/home/admin/.m2/repository/,Mac系统是/Users/wxq/.m2/repository/。如果要修改本地仓库的位置,更改Maven解压后目录下conf中的settings.xml文件,找到localRepository标签,将其值设置为想要的本地路径,例如:

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

<!-- localRepository

|The path to the local repository maven will use to store artifacts.

|

|Default: ${user.home}/.m2/repository

-->

<localRepository>D:/LocalRepository</localRepository>

</settings>

中央仓库是由Maven社区提供的仓库,其中包含了绝大多数流行的开源Java依赖。这个仓库不需要配置,只要有网络就可以直接使用。如果你想确认一下某依赖在中央仓库中是否真的存在,可以在http://search.maven.org/#browse搜索。使用中央仓库下载依赖可能会很慢,所以需要配置一个国内的镜像地址来代替原中央仓库的默认地址,推荐使用阿里云的镜像地址。打开Maven解压后目录下conf中的settings.xml文件,在mirrors标签中添加如下镜像配置即可。

<mirror>

<id>alimaven</id>

<name>aliyun maven</name>

<url>http://maven.aliyun.com/nexus/content/groups/public/</url>

<mirrorOf>central</mirrorOf>

</mirror>

远程仓库是开发人员自己定制的仓库,用于存放不想被公开的私有依赖,例如用于存放管理个人/公司开发的公共jar。远程仓库可以在pom.xml中配置,这里不详细描述步骤了。

认识pom.xml

pom.xml是Maven的基本工作单元,包含了项目的基本信息,声明了项目依赖、项目如何构建等等。使用Maven时,Maven会自动在当前目录中查找pom.xml,读取pom.xml,获取所需的配置信息,然后执行目标任务。pom.xml一般放置在项目源码的根目录下。

每个pom.xml都有一个父pom.xml,父pom.xml中包含了一些可以被继承的默认设置,例如当查找依赖时,如果本地仓库中没有,默认会从中央仓库中查找依赖,但是这个中央仓库默认是不需要配置的,是因为在父pom.xml中配置了中央仓库的地址http://repo1.maven.org/maven2。

pom.xml文件元素有很多,这里只介绍常用的部分标签元素。

<?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.xml中定义的元素值被本项目继承下来,也就是说如果本项目pom.xml中某元素没定义,那么默认会自动使用父项目定义的值-->

<parent>

<!--指定父项目的全球唯一标识-->

<groupId>com.alibaba.nacos</groupId>

<!--指定父项目的构件标识-->

<artifactId>nacos-all</artifactId>

<!--指定父项目的版本号-->

<version>1.2.1</version>

<!--指定父项目pom.xml文件的相对路径。默认值是../pom.xml-->

<relativePath>../pom.xml</relativePath>

</parent>

<!--指定模型版本号,指定当前pom.xml应遵循哪一个POM模型版本,当前版本4.0.0-->

<modelVersion>4.0.0</modelVersion>

<!--定义本项目的全球唯一标识-->

<groupId>com.wind.cloud</groupId>

<!--定义本项目的构建标识,它和groupId一起唯一标识一个构件-->

<artifactId>demo</artifactId>

<!--指定本项目的构建版本号-->

<version>1.0-SNAPSHOT</version>

<!--目标构建类型,如jar、war、pom等,默认是jar-->

<packaging>jar</packaging>

<!--定义key-value形式的属性,这些属性可以在全局使用-->

<properties>

<maven.compiler.source>1.8</maven.compiler.source>

<maven.compiler.target>1.8</maven.compiler.target>

<alibaba-nacos-config-version>2.2.1.RELEASE</alibaba-nacos-config-version>

</properties>

<!--项目需要的依赖列表-->

<dependencies>

<!--依赖的具体信息-->

<dependency>

<!--依赖的全球唯一标识-->

<groupId>com.alibaba.cloud</groupId>

<!--依赖的构建标识-->

<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>

<!--依赖的版本号-->

<version>${alibaba-nacos-config-version}</version>

<!--指定依赖在什么时候被使用,默认是compile,即编译-->

<!--如果值为test,则用于test任务时使用-->

<scope>compile</scope>

<!--当有传递依赖时,从依赖列表中排除某些不需要的依赖-->

<exclusions>

<!--排除依赖的信息-->

<exclusion>

<!--排除依赖的构建标识-->

<artifactId>org.slf4j</artifactId>

<!--排除依赖的全球唯一标识-->

<groupId>slf4j-api</groupId>

</exclusion>

</exclusions>

</dependency>

</dependencies>

<!--项目构建管理,默认会使用父pom.xml中的配置,没有特殊需求可以不配置-->

<build>

<!--使用的插件列表 -->

<!--Maven社区提供了很多不同功能的插件可以使用,这里不一一介绍了,有需要的在Maven官网查看(https://maven.apache.org/)-->

<plugins>

<!--plugin元素描述插件所需要的信息-->

<plugin>

<!--插件的artifactId-->

<artifactId>maven-compiler-plugin</artifactId>

<!--插件的版本-->

<version>3.5.1</version>

<!--插件工作时需要的参数配置-->

<configuration>

<source>${maven.compiler.source}</source>

<target>${maven.compiler.target}</target>

<compilerVersion>${maven.compiler.source}</compilerVersion>

<showDeprecation>true</showDeprecation>

<showWarnings>true</showWarnings>

</configuration>

</plugin>

</plugins>

</build>

</project>

依赖管理

在pom.xml文件的dependencies标签中通过添加dependency元素添加项目依赖。实际的开发中,通常将项目的公共依赖定义到父项目的pom.xml中,或者定义到公共项目的pom.xml中。

Maven中的项目依赖是可传递的,例如项目A依赖jar包B,项目C依赖项目A构建后的jar包,那么项目C间接依赖jar包B。

有时,这种依赖传递会导致依赖的版本冲突,可以通过配置exclusions排除某些不需要的依赖,当然也可以通过optional标记某传递依赖是可选的。

<!--项目需要的依赖列表-->

<dependencies>

<!--依赖的具体信息-->

<dependency>

<!--依赖的全球唯一标识-->

<groupId>com.alibaba.cloud</groupId>

<!--依赖的构建标识-->

<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>

<!--依赖的版本号-->

<version>${alibaba-nacos-config-version}</version>

<!--指定依赖在什么时候被使用,默认是compile,即编译-->

<!--如果值为test,则用于test任务时使用-->

<scope>compile</scope>

<!--当有传递依赖时,从依赖列表中排除某些不需要的依赖-->

<exclusions>

<!--排除依赖的信息-->

<exclusion>

<!--排除依赖的构建标识-->

<artifactId>org.slf4j</artifactId>

<!--排除依赖的全球唯一标识-->

<groupId>slf4j-api</groupId>

</exclusion>

</exclusions>

</dependency>

<dependency>

<!--依赖的全球唯一标识-->

<groupId>com.alibaba</groupId>

<!--依赖的构建标识-->

<artifactId>dubbo</artifactId>

<!--依赖的版本号-->

<version>2.6.8</version>

<!--指定依赖在什么时候被使用,默认是compile,即编译-->

<!--如果值为test,则用于test任务时使用-->

<scope>compile</scope>

<!--当有传递依赖时,指定依赖是可选的-->

<optional>true</optional>

</dependency>

</dependencies>

Maven构建生命周期

Maven构建生命周期(lifecycle)由各个阶段组成,每个阶段由Maven的插件plugin来执行完成。一般情况下,一个项目的Maven构建生命周期由以下几个阶段的序列组成。

32qaamm.png!mobile

2mu26jI.png!mobile

Maven构建命令

在pom.xml文件所在的路径使用mvn命令,Maven会自动查找pom.xml,加载解析并执行文件中的构建任务。

一般常用的构建命令有mvn clean package、mvn clean install和mvn clean deploy。

mvn clean package:依次执行移除所有上一次构建生成的文件、代码编译、单元测试、打包。

mvn clean install:依次执行移除所有上一次构建生成的文件、代码编译、单元测试、打包、将打好的包安装到本地仓库。

mvn clean deploy:依次执行移除所有上一次构建生成的文件、代码编译、单元测试、打包、将打好的包安装到本地仓库、将打好的包发布到远程仓库。

IntelliJ IDEA中使用Maven

最新版本的IntelliJ IDEA会自带Maven插件,但还是建议通过配置更改成本机安装的Maven,这样方便更改Maven相关配置。

新建Maven项目或打开已有的Maven项目后,IDEA会自动识别项目中的pom.xml,在IDEA右侧的窗口中会展示pom.xml中使用到的插件和构建声明周期,例如下图所示。

emu2q2e.png!mobile

双击Lifecycle中的某阶段,会自动执行相应的构建任务。当然,也可以通过IDEA中的Terminal直接执行mvn命令。

Eclipse中使用Maven

最新版本的Eclipse会自带Maven插件,但还是建议通过配置更改成本机安装的Maven,这样方便更改Maven相关配置。

新建Maven项目或打开已有的Maven项目后,Eclipse会自动识别项目中的pom.xml。项目代码在Eclipse中打开后,右键选中项目,然后选择Run As,会列出可执行的Maven构建任务。

往期推荐

Java开发人员必知的常用类库,这些你都知道吗?

聊一聊Redis官方置顶推荐的Java客户端Redisson

我画了25张图展示线程池工作原理和实现原理,原创干货,建议先收藏再阅读

Spring框架你敢写精通,面试官就敢问@Autowired注解的实现原理

面试被问为什么使用Spring Boot?答案好像没那么简单

Spring声明式事务处理的实现原理,来自面试官的穷追拷问

没使用加号拼接字符串,面试官竟然问我为什么

面试官一步一步的套路你,为什么SimpleDateFormat不是线程安全的

都说ThreadLocal被面试官问烂了,可为什么面试官还是喜欢继续问

Java注解是如何玩转的,面试官和我聊了半个小时

学之多,而后知之少 !以上是本次分享的内容,朋友们点【在看】是我持续更新的最大动力,我们下期见!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK