1.Maven入门
本章目标
- Maven配置
- idea安装
本章内容
一、Maven安装配置
1、Maven是什么
Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建
和依赖管理
。Maven 这个单词的本意是:专家,内行。读音是[’meɪv(ə)n]或[’mevn]。
构建工具的发展:Make→Ant→Maven→Gradle,Maven的历史很久远,2001提交的原型代码,2003年成为了APCHE软件基金会的项目
2、下载安装
2.1、下载Maven
- 访问 Maven官方网站,打开后找到下载链接,如下:
-
下载Maven后,解压到本地磁盘,解压目录中不要含有中文,也不要含有空格,解压后的目录如下:
解压缩到文件夹 – D:-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等等。
2.2、 环境变量
确认jdk环境变量是好的
- 添加 MAVEN_HOME 环境变量到 Windows 环境变量,并将其指向你的 Maven 文件夹。
- 修改Path环境变量,在其中追加Maven的bin目录
- 在命令行中输入”mvn -v”,能看到以下内容,就说明Maven环境配置好了
按键盘上win图标+r,快速打开黑窗口命令框
如果你看到类似消息,说明 Apache Maven 在 Windows 上已安装成功。
3、Maven仓库
实际的Maven项目将不再各自存储其依赖文件,它们只需要声明这些依赖的坐标,在需要的时候(例如,编译项目的时候需要将依赖加入到classpath中),Maven会自动根据坐标找到仓库中的构件,并使用它们。
3.1、在Maven中会涉及到几种仓库:
- 工作空间,即我们的项目工程,这里面可能会放着pom.xml文件,这个pom.xml就是maven的配置文件
- 本地仓库,本地仓库用于存放jar包,其实Jar包并不是直接放入工作空间的,它是存放在本地仓库,然后在执行发布打包的时候,添加依赖路径
- 中央仓库:Maven中央存储库是由Maven社区提供的资源库。它包含了大量的常用程序库。它不要求配置,搜索时需要互联网接入
- 私库:是架设在本机或者局域网中的一种特殊的远程仓库,通过私服可以方便的管理其它所有的外部远程仓库,用于缓解频繁从外网下载jar包资源的压力。而且使用私库作为缓存层,也相对安全一些。
- 其它共享仓库:除了中央仓库和私服,还有很多其他公开的远程仓库,常见的有Java.NET Maven库(http://download.java.net/maven/2/)和jboss Maven库(http://repository.jboss.com/maven2/)等
通过下面这张图可以清晰地表达项目、本地仓库、远程仓库(共享仓库)之间的关系
共享仓库即中央仓库
在Maven世界中,任何一个依赖、插件或者项目构建的输出,都可以称为构件。得益于坐标机制,任何Maven项目使用任何一个构件的方式都是完全相同的。在此基础上,Maven可以在某个位置统一存储所有Maven项目共享的构件,这个统一的位置就是仓库。为了实现重用,项目构建完毕后可生成的构件也可以安装或者部署到仓库中,供其他项目使用。
3.2、Maven 依赖库搜索顺序
当我们在pom中声明了依赖关系后,参考上面的图:
当我们执行 Maven 构建命令,Maven 依赖库按以下顺序进行搜索:
-
Maven在执行相关的任务时,会先去本地仓库查看是否有该资源,如果有的话,判断版本是否正确,如果一切都没问题则直接使用;否则,执行下一步
-
Maven会去配置的中央仓库中查找,如果找到就拷贝到本地仓库中;找不到则会给出相关的提示
-
Maven在本地如果搭建了私库,则会去私库中查找,找到就拷贝到本地仓库;找不到就会去中央仓库中查找,然后放入私库和本地库。
有了私库,局域网内的开发者可以共享依赖,就不用每个人都去外网下载jar包,浪费带宽了。
3.3、本地仓库位置
repository(/rɪˈpɑːzətɔːri/)
默认情况下,不管是在windows还是Linux上,每个用户在自己的用户目录下都有一个路径名为.m2/repository/
的仓库目录。
windows系统中本地仓库默认路径在我们C盘目录下,对于专业人士来说C盘很危险,下面我们修改一下默认配置。
关于本地仓库和共享仓库的配置都在settings.xml中,这个文件位于conf中,我们直接修改解压后的目录中的settings.xml的配置文件。
关于未出现.m2/repository/的仓库目录的问题,需要运行mvn命令才会出现。
如果已经配置了其它盘符的路径,则无需再到.m2下去查看,如果未出现又想看到.m2文件夹,可以运行 mvn help:system生成
可以通过win图标+r在黑窗口中输入.直接进入用户根目录下
编辑文件D:-maven-3.5.0.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>/path/to/local/repo</localRepository>
-->
<localRepository>D:\apache-maven-3.5.0\repository</localRepository>
</settings>
这样,该用户的本地仓库地址就被设置成了D:-maven-3.5.0。
3.4、中央仓库
Maven的安装文件自带了中央仓库的配置,不需要我们配置,查看一下即可
使用解压工具打开jar文件D:/apache-maven-3.8.1/lib/maven-model-builder-3.5.jar(我的路径:D:-maven-3.8.1),然后访问路径:org/apache/maven/model/pom-4.0.0.xml,可以看到如下的配置:
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
可以通过https://repo.maven.apache.org/maven2访问远程仓库
3.5、私服
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。此外,一些无法从外部仓库下载到的构件也能从本地上传到私服上供大家使用。
3.6、镜像仓库
镜像仓库可以理解为仓库的副本,由于Maven默认仓库路径为国外网站,访问外网站点下载jar包时会比较慢,所以国内大公司专门建议了镜像,把国外网站内容下载到国内镜像供我们下载使用。这样我们再下载依赖时直接从国内镜像摘取,速度会快很多
Maven中央仓库下载速度非常慢,所以我们要指定一个下载速度较快的Maven阿里云镜像仓库,打开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>
指明了为哪个仓库配置镜像,可以使用通配符如: * ,或者repo1,repo2 等进行匹配。一旦配置了镜像,所有针对原仓库的访问将转到镜像仓库的访问,原仓库将不再能直接访问,即使镜像仓库不稳定或停用。
二、Maven项目的结构
本节目标:主要掌握Maven项目的结构组成以及基本命令的使用
不同IDE的构建目录各不相同,以下是随便写得例子,但是能说明问题:
eclipse | JBuilder | NetBeans | idea | … |
---|---|---|---|---|
src build | src output | src classes | src target | … |
而Maven的一个伟大之处在于,不管使用什么样的工具创建一个Maven项目。它统一了全世界的java项目结构:
4.1、Maven的约定
Maven采用了约定大于配置的方式。也就是只要我们使用Maven来管理一个项目,那么该项目中源代码的位置,字节码的位置,配置文件的位置都是固定的,如下,以下一个名为Hello的项目为例
约定大于配置:
百度百科:约定大于配置,也可以叫做约定优于配置(convention over configuration)),也称作按约定编程,是一种软件设计范式,指在减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。
在开发的时候,很多时候有些东西如果你没有配置的话,程序就会取一个默认值,而这个默认值就是约定,也可以理解为:因为他有默认值,我就不需要在配置了,它会自动用默认值,或者按默认结构去读取
比如同内汽车方向盘都是在左,国外大部分汽车方向盘在右,这都是约定好的事情
目录 | 描述 |
---|---|
src/main/java | 存放项目的java文件。 |
src/main/resources | 存放项目的资源文件,比如mybatis-config.xml |
src/main/webapp | 只有web项目才有 |
src/test/java | 存放所有的测试的java文件 |
src/test/resources | 存放测试用的资源文件 |
target | 项目输出位置 |
pom.xml | 依赖文件 |
4.2、创建目录结构
手动创建一个Maven项目,编写代码,编译,并运行。
javase项目的目录结构(jar项目)
Hello
|---src
|---|---main
|---|---|---java
|---|---|---resources(不是必须)
|---|---|---webapp(web项目中才有)
|---|---test
|---|---|---java
|---|---|---resources(不是必须)
|---target
|---pom.xml
4.3、创建pom.xml
pom是项目对象模型(Project Object Model)的简称,一个典型的pom.xml配置文件如下:
注意:由于Maven是Java编写的,所以Maven自然地把项目当做一个对象来看待,而pom.xml就是一个用于描述当前项目对象的配置文件,每个Maven项目都必须有一个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模型的版本,对于Maven2及Maven 3来说,它只能是4.0.0 -->
<modelVersion>4.0.0</modelVersion>
<!-- 群组ID: 公司域名反写 -->
<groupId>com.woniuxy</groupId>
<!-- 项目ID: 一个公司只有一个域名,但是可以有多个项目 -->
<artifactId>HelloMaven</artifactId>
<!-- 版本号:<主版本>.<次版本>.<增量版本> - <里程碑版本> -->
<version>0.0.1-SNAPSHOT</version>
<!-- 打包方式,取值可以是:jar、war、pom -->
<packaging>jar</packaging>
<!-- 默认字符集,无论在什么操作系统上执行,统一指定编码格式,windows上默认是gbk,而mac默认是utf-8,linux默认也是utf-8 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
文件放到根目录下
maven的版本构成:
<主版本>.<次版本>.<增量版本> - <里程碑版本> //5.2.9.RELEASE
版本 | 说明 |
---|---|
主版本 | 表示项目的重大架构变化。如spring4 和spring5 架构重大改变 |
次版本 | 较大范围功能增加和变化,及bug修复,并且不涉及到架构变化的 |
增量版本 | 表示重大bug的修复,如果发现项目发布之后,出现影响功能的bug,及时修复,则应该是增量版本的变化 |
里程碑版本 | 往往表示某个版本的里程碑,见下表格 |
com.wn. HelloMaven_0.0.1-SNAPSHOT
里程碑版本 | 说明 |
---|---|
snapshot | 开发版 |
alpha | 内部测试版 |
beta | 公开测试版 |
Release | 发布版 |
关于版本可以查看一下mybatis的版本信息(前提是能打开github)https://github.com/mybatis/mybatis-3/
Spring各版本:https://repo.spring.io/ui/native/libs-release-local/org/springframework/spring/
4.4依赖坐标
在maven项目中如何引入jar包?
中央仓库地址:https://mvnrepository.com/
当我们把一个依赖的坐标写入pom.xml中的dependencies元素中后,在编译时Maven就会为我们下载对应的依赖
<!-- 依赖管理 -->
<dependencies>
<!-- 具体的依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
此处的参数和我们创建项目时pom文件头部声明一样的,我们的项目本身也可以补其它项目引用,每个依赖本身就是一个maven项目
-
groupId:公司或组织域名倒序+项目名
< groupId>com.wn.maven</groupId>
-
artifactId[/ˈɑːrtɪfækt]:模块名、项目名
< artifactId>HelloMaven< /artifactId>
-
version:版本
-
引入mysql依赖
mysql mysql-connector-java 8.0.29
注意,引入一个依赖时,也会同时把该依赖相关的其他依赖一起引入进来
三、依赖范围
本节目标:掌握坐标依赖中scope的作用,以及常用属性值,面试点
maven项目加载依赖的顺序:
- 先到本地仓库中根据项目坐标找依赖
- 找不到的话会在远程仓库下载
- 下载到本地仓库
1、依赖
当 A jar 包用到了 B jar 包中的某些类时,A 就对 B 产生了依赖,这是概念上的描述。Maven解析依赖信息时会到仓库中查找被依赖的jar包。
比如我们刚才建立的项目依赖了junit.Maven首先会到本地仓库去找对应的依赖,如果没有则从远程仓库下载到本地仓库
使用idea新建立一个web项目:OneWeb,在其中引用我们之前建立的项目Hello
<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.wn</groupId>
<artifactId>oneWeb</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.wn</groupId>
<artifactId>HelloMaven</artifactId>
<version>0.0.2-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
由于本地仓库没有version为如果0.0.2-SNAPSHOT版本的HelloMaven,加载依赖时会报错
2、依赖的范围
Maven是通过坐标来引入jar的,在打jar包的同时也可以指定这个jar包的作用范围。
maven的依赖范围包括: compile
,provide
,runtime
,test
,system
。
- 对应的范围及表述
范围 | 表述 |
---|---|
compile | 表示编译范围,指A在编译时依赖B,该范围为默认依赖范围。编译范围的依赖会用在编译,测试,运行,由于运行时需要,所以编译范围的依赖会被打包 |
provided | provied依赖只有当jdk或者一个容器已提供该依赖之后才使用。provide依赖在编译和测试时需要,在运行时不需要。例如:servlet api被Tomcat容器提供了 |
runtime | runtime依赖在运行和测试系统时需要,但在编译时不需要。例如:jdbc的驱动包。由于运行时需要,所以runtime范围的依赖会被打包 Class.forName(“驱动”),里面驱动只有在运行时才会被加载 |
test | test范围依赖在编译和运行时都不需要,只在测试编译和测试运行时需要。例如:Junit。由于运行时不需要,所以test范围依赖不会被打包 |
system | system范围依赖与provide类似,但是必须显示的提供一个对于本地系统中jar文件的路径。一般不推荐使用 |
- 依赖一览表
依赖范围 | 编译 | 测试 | 运行时 | 是否会被打入jar包 |
---|---|---|---|---|
compile | √ | √ | √ | √ |
provided | √ | √ | × | × |
runtime | × | √ | √ | √ |
test | × | √ | × | × |
system | √ | √ | × | √ |
3、compile和test的区别
注意:是war包
从项目结构角度理解compile和test的区别,下面我们以junit依赖进行测试
3.1 compile范围依赖
主程序 | 测试程序 | 是否参与打包 |
---|---|---|
有效、可见 | 有效、可见 | 参与 |
-
pom文件中指定scope
junit
junit
4.11
compile -
此时我们发现无论是App,还是AppTest都可以正常导入包
- 测试是否参与打包
- 测试过程如题出现以下异常
-
添加plugin(引入的时候爆红,不碍事)
<plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <testFailureIgnore>true</testFailureIgnore> </configuration> </plugin> </plugins>
记得更新maven
-
在idea中查看,发现引入了该包
3.2 test范围依赖
主程序 | 测试程序 | 是否参与打包 |
---|---|---|
无效、不可见 | 有效、可见 | 不参与 |
- pom文件中指定scope,记得要刷新maven依赖
- 重新打包,记得要先clean一下,发现此时lib文件夹都不存在
4、provided范围依赖
主程序 | 测试程序 | 是否参与打包 |
---|---|---|
有效、可见 | 有效、可见 | 不参与 |
-
pom文件中指定scope
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency>
-
分别在test和main下面建立servlet的子类,我发现都可以正常使用
- 打包时发现没有
因为tomcat容器中自带servlet.api对应的jar包,程序在运行时会自动去使用容器中的包,所以不需要我们在打包也该包也打包到项目中
四、Maven常用命令
本节目标:掌握Maven常用命令package、install、deploy,了解Maven生命周期
注意:以下对应命令必须要在项目根目录下才能运行,即pom.xml文件所在的位置
命令 | 描述 |
---|---|
mvn -v | 显示Maven版本信息 |
mvn compile | 编译src/main/java下的所有Java源文件 |
mvn clean | 清除target |
mvn test | 执行src/test/java下的测试用例 |
mvn package | 打包项目,在target下生成jar或war |
mvn install | 将打包好的jar或war存入到本地仓库中,供其他Maven项目使用 |
mvn deploy | 将最终的包复制到远程的仓库,以让其它开发人员与项目共享或部署到服务器上运行。 |
mvn compile 和 mvn clean我们已经熟悉了,mvn deploy会放到最后讲解,下面学习其他的命令
本文来自博客园,作者:icui4cu,转载请注明原文链接:https://www.cnblogs.com/icui4cu/p/18825469