Maven简介
Maven作为一个构建工具,不仅能帮我们自动化构建,还能够抽象构建过程,提供构建任务实现;它跨平台,对外提供了一致的操作接口,这一切足以使它成为优秀的、流行的构建工具。
Maven不仅是构建工具,还是一个依赖管理工具和项目管理工具,它提供了中央仓库,能帮我自动下载构件。
Maven安装
Windows安装Maven
-
在安装maven之前首先先确定Windows上安装了Jdk
-
然后去Maven官网maven.apache.org/download.cg…下载.zip结尾的Maven文件,如下图:
-
最后设置环境Maven的环境变量,主要配置M2_HOME和PATH两项,步骤如下图:
Mac安装Maven
-
第一步和Windows一样,下载Maven,格式为tar.gz,解压之后放到你想放到的位置
-
然后打开终端输入
vim ~/.bash_profile,在环境变量中添加一条export PATH="~/software/Maven/apache-maven-3.5.4/bin":$PATH,后面是我本机根目录的位置,添加之后:wq保存退出,然后source ~/.bash_profile使配置生效。 -
输入
mvn -version查看是否安装成功
Maven目录
bin目录
该目录包含了mvn运行的脚本,这些脚本用来配置java命令,准备好classpath和相关的Java系统属性,然后执行Java命令。
boot目录
该目录只包含一个文件,该文件为plexus-classworlds-2.5.2.jar。plexus-classworlds是一个类加载器框架,相对于默认的java类加载器,它提供了更加丰富的语法以方便配置,Maven使用该框架加载自己的类库。
conf目录
该目录包含了一个非常重要的文件settings.xml。直接修改该文件,就能在机器上全局地定制Maven的行为,一般情况下,我们更偏向于复制该文件至/.m2/目录下(表示用户目录),然后修改该文件,在用户范围定制Maven的行为。
lib目录
该目录包含了所有Maven运行时需要的Java类库,Maven本身是分模块开发的,因此用户能看到诸如maven-core-3.0.jar、maven-model-3.0.jar之类的文件,此外这里还包含一些Maven用到的第三方依赖如commons-cli-1.2.jar、commons-lang-2.6.jar等等。
Maven常用命令
mvn dependency:tree,查看项目中jar包的依赖数,解决jar包冲突问题。
mvn clean:表示运行清理操作(会默认把target文件夹中的数据清理)。
mvn clean compile:表示先运行清理之后运行编译,会将代码编译到target文件夹中。
mvn clean test:运行清理和测试。
mvn clean package:运行清理和打包。
mvn clean install:运行清理和安装,会将打好的包安装到本地仓库中,以便其他的项目可以调用。
mvn clean deploy:运行清理和发布(发布到私服上面)。
配置setting.xml文件
说明:
Maven的级别有两种,一是用户级别,该级别是默认级别.第二种是全局的配置.一般不生效.但是要求两种级别的配置文件必须相同,否则会有意想不到的异常.
配置本地仓库
<!-- Windows中的配置-->
<localRepository>E:/software/mvn_repo</localRepository>
<!-- Mac中的配置 -->
<!--
<localRepository>/Users/hxx/software/mvn_repo</localRepository>
-->
配置阿里中央仓库
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
配置jdk
说明:Maven通过骨架创建项目时默认的JDK版本1.5,所以需要手动修改JDK,但是修改繁琐,所以添加如下的配置
<!-- 全局jdk配置,settings.xml -->
<profile>
<id>jdk17</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.7</jdk>
</activation>
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion>
</properties>
</profile>
<!-- jdk1.8配置
<profile>
<id>jdk18</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
-->
Maven在开发工具中的使用
博主现在想要在自己的开发工具中使用自己配置好的Maven,所以来介绍一下,一下是Eclipse和Idea中的Maven配置
基于Eclipse中使用
- 打开设置Preferences;
- 在左侧边栏有个Maven,点击Maven,勾选上Download Artifact Sources,意思是引入依赖后自动下载关联源码,不需要可以不勾选;
- 然后展开,点击Maven下面的installations,点击右边的Add,选择配置好的Maven,点击Finish,然后,勾选到添加的Maven选项上;
- 点击Maven下面的User Settings,Global Settings和User Settings都选择Maven根目录下面conf文件夹下的settings.xml文件,点击Apply and Close 关闭即可!
基于Idea中使用
- 打开Idea中的Preferences
- 左上角输入Maven搜索,按照如下图操作即可:
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.hxxzt</groupId>
<artifactId>Maventest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Maventest</name>
</project>
这里需要说明一下,这里的groupId、artifactId、version都是自己定义的,与上面解释的坐标不一样,坐标是在Maven中央仓库中的地址,这个定义的是你自己项目的坐标,注意~
-
代码的第一行是XML头,指定了该xml文档的版本和编码方式。
-
project是所有pom.xml的根元素,它还声明了一些POM相关的命名空间及xsd元素。
-
根元素下的第一个子元素modelVersion指定了当前的POM模型的版本,对于Maven3来说,它只能是4.0.0
代码中最重要是包含了groupId,artifactId和version了。这三个元素定义了一个项目基本的坐标,在Maven的世界,任何的jar、pom或者jar都是以基于这些基本的坐标进行区分的。
-
groupId定义了项目属于哪个组,随意命名,比如谷歌公司的myapp项目,就取名为 com.google.myapp
-
artifactId定义了当前Maven项目在组中唯一的ID,比如定义hello-world。
-
version指定了项目当前的版本0.0.1-SNAPSHOT,SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的。
-
name元素生命了一个对于用户更为友好的项目名称,虽然这不是必须的,但还是推荐为每个POM声明name,以方便信息交流
坐标和依赖
何为坐标?
关于坐标(Coordinate),大家最熟悉的定义应该 来自于平面几何。在一个平面坐标系中,坐标( x, y)表示该平面上与x轴距离为y,与y轴距离为x的一点,任何一个坐标都能够唯一标识该平面中的一点。在实际生活中,我们也可以将地址看成是一种坐标。省、市、区、街道等一系列信息同样可以唯一标识城市中的任一居住地址和工作地址。邮局和快递公司正是基于这样一种坐标进行日常工作的。
Maven坐标为各种构件引入了秩序,任何一个构件都必须明确定义自己的坐标,而一组Maven坐标是通过一些 元素定义的,它们是groupId、artifactId、version、packaging、classifier。
依赖的配置
<project>
...
<dependencies>
<dependency>
<groupId>实际项目</groupId>
<artifactId>模块</artifactId>
<version>版本</version>
<type>依赖类型</type>
<scope>依赖范围</scope>
<optional>依赖是否可选</optional>
<!—主要用于排除传递性依赖-->
<exclusions>
<exclusion>
<groupId>…</groupId>
<artifactId>…</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependencies>
...
</project>
根元素project下的dependencies可以包含一个或者多个dependency元素,以声明一个或者多个项目依赖。每个依赖可以包含的元素有:
- grounpId、artifactId和version:以来的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。
- type:依赖的类型,对于项目坐标定义的packaging。大部分情况下,该元素不必声明,其默认值为jar
- scope:依赖的范围
- optional:标记依赖是否可选
- exclusions:用来排除传递性依赖
依赖范围
依赖范围就是用来控制依赖和三种classpath(编译classpath,测试classpath、运行classpath)的关系,Maven有如下几种依赖范围:
-
compile:编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效。典型的例子是spring-code,在编译、测试和运行的时候都需要使用该依赖。
-
test: 测试依赖范围。使用次依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此依赖。典型的例子是Jnuit,它只有在编译测试代码及运行测试的时候才需要。 provided:已提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试classpath有效,但在运行时候无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器以及提供,就不需要Maven重复地引入一遍。
-
runtime:运行时依赖范围。使用此依赖范围的Maven依赖,对于测试和运行classpath有效,但在编译主代码时无效。典型的例子是JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。
-
system:系统依赖范围。该依赖与三种classpath的关系,和provided依赖范围完全一致,但是,使用system范围的依赖时必须通过systemPath元素显示地指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能构成构建的不可移植,因此应该谨慎使用。systemPath元素可以引用环境变量,如:
<dependency>
<groupId>javax.sql</groupId>
<artifactId>jdbc-stdext</artifactId>
<Version>2.0</Version>
<scope>system</scope>
<systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>
- import:导入依赖范围。该依赖范围不会对三种classpath产生实际的影响。
上述除import以外的各种依赖范围与三种classpath的关系如下:
总结
后面有需要补充的继续更新。本篇基于许晓兵《Maven实战》提炼,亚马逊购买本书请戳此处—->《Maven实战》购买