maven篇1: 安装、设置和环境变量配置

时间:2022-10-09 13:00:09


一、为什么需要maven

① 一个项目就是一个工程

如果项目非常庞大,就不适合使用package来划分模块,最好是每一个模块对应一个工程,利于分工协作。借助于maven就可以将一个项目拆分成多个工程

② 项目中使用jar包,需要“复制”、“粘贴”项目的lib中

同样的jar包重复的出现在不同的项目工程中,你需要做不停的复制粘贴的重复工作。借助于maven,可以将jar包保存在“仓库”中,不管在哪个项目只要使用引用即可就行。

③ jar包需要的时候每次都要自己准备好或到官网下载

借助于maven我们可以使用统一的规范方式下载jar包,规范

④ jar包版本不一致的风险

不同的项目在使用jar包的时候,有可能会导致各个项目的jar包版本不一致,导致未执行错误。借助于maven,所有的jar包都放在“仓库”中,所有的项目都使用仓库的一份jar包。

⑤ 一个jar包依赖其他的jar包需要自己手动的加入到项目中

FileUpload组件->IO组件,commons-fileupload-1.3.jar依赖于commons-io-2.0.1.jar

极大的浪费了我们导入包的时间成本,也极大的增加了学习成本。借助于maven,它会自动的将依赖的jar包导入进来。

二、什么是maven

一个构建、打包、部署项目的工具
构建定义:把动态的Web工程经过编译得到的编译结果部署到服务器上的整个过程。
编译:java源文件[.java]->编译->Classz字节码文件[.class]
部署:最终在sevlet容器中部署的不是动态web工程,而是编译后的文件

maven篇1: 安装、设置和环境变量配置

三、maven机制

maven篇1: 安装、设置和环境变量配置

三、下载、安装、配置

1、下载

下载链接

​Maven – Download Apache Maven​

maven篇1: 安装、设置和环境变量配置


下载完解压到非中文、没有空格的目录即可完成安装

在解压目录中,我们需要着重关注 Maven 的核心配置文件:conf/settings.xml

2、指定本地仓库

本地仓库默认值:用户家目录/.m2/repository。由于本地仓库的默认位置是在用户的家目录下,而家目录往往是在 C 盘,也就是系统盘。将来 Maven 仓库中 jar 包越来越多,仓库体积越来越大,可能会拖慢 C 盘运行速度,影响系统性能。所以建议将 Maven 的本地仓库放在其他盘符下。配置方式如下:


<!-- 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:\maven-repository</localRepository>


3、配置阿里云提供的镜像仓库

Maven 下载 jar 包默认访问*的*仓库,而国外网站速度很慢。改成阿里云提供的镜像仓库,访问国内网站,可以让 Maven 下载 jar 包的时候速度更快。配置的方式是:
将原有的例子配置注释掉


<!-- <mirror>  <id>maven-default-http-blocker</id>
<mirrorOf>external:http:*</mirrorOf>
<name>Pseudo repository to mirror external repositories initially using HTTP.</name>
<url>http://0.0.0.0/</url>
<blocked>true</blocked>
</mirror> -->


加入我们的配置
将下面 mirror 标签整体复制到 settings.xml 文件的 mirrors 标签的内部

<mirror>    <id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>


4、配置 Maven 工程的基础 JDK 版本

如果按照默认配置运行,Java 工程使用的默认 JDK 版本是 1.5,而我们熟悉和常用的是 JDK 1.8 版本。修改配置的方式是:将 profile 标签整个复制到 settings.xml 文件的 profiles 标签内。


<profile>   <id>jdk-1.8</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>


5、环境变量配置

首先要确保安装了java,

配置 MAVEN_HOME

maven篇1: 安装、设置和环境变量配置


配置PATH

maven篇1: 安装、设置和环境变量配置


最后通过命令mvn -v 或mvn -version即可查看到Maven是否安装成功,安装成功即可看到相关版本信息

注意:每次配完之后都要重新开启cmd

这里还需要强调一点就是安装Maven之前务必确保正确安装了JDK,我们这里安装的maven-3.3.3必须要装JDK1.7+,否则Maven无法正常使用,关于这一点我们在官网的Documentation的Download目录下可以看到,如果你以后使用IDE去创建Maven项目的话也务必要配置好正确版本的JDK。

四、生命周期

为了让构建过程自动化完成,Maven 设定了三个生命周期,生命周期中的每一个环节对应构建过程中的一个操作。

生命周期名称

作用

各个环节

Clean

清理操作相关

pre-clean

clean

post-clean

Site

生成站点相关

pre-site

site

post-site

deploy-site

Default

主要构建过程

validate

generate-sources

process-sources

generate-resources

process-resources 复制并处理资源文件,至目标目录,准备打包。

compile 编译项目 main 目录下的源代码。

process-classes

generate-test-sources

process-test-sources

generate-test-resources

process-test-resources 复制并处理资源文件,至目标测试目录。

test-compile 编译测试源代码。

process-test-classes

test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。

prepare-package

package 接受编译好的代码,打包成可发布的格式,如JAR。

pre-integration-test

integration-test

post-integration-test

verify

install将包安装至本地仓库,以让其它项目依赖。

deploy将最终的包复制到远程的仓库,以让其它开发人员共享;或者部署到服务器上运行(需借助插件,例如:cargo)。

  • 前面三个生命周期彼此是独立的。
  • 在任何一个生命周期内部,执行任何一个具体环节的操作,都是从本周期最初的位置开始执行,直到指定的地方

Maven 之所以这么设计其实就是为了提高构建过程的自动化程度:让使用者只关心最终要干的即可,过程中的各个环节是自动执行的。

五、依赖关系

Maven定义了几种依赖关系,分别是​​compile​​​、​​test​​​、​​runtime​​​和​​provided​​:

scope

说明

示例

compile

编译时需要用到该jar包(默认)

commons-logging

test

编译Test时需要用到该jar包

junit

runtime

编译时不需要,但运行时需要用到

mysql

provided

编译时需要用到,但运行时由JDK或某个服务器提供

servlet-api

其中,默认的​​compile​​是最常用的,Maven会把这种类型的依赖直接放入classpath。

​test​​​依赖表示仅在测试时使用,正常运行时并不需要。最常用的​​test​​依赖就是JUnit:

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.3.2</version>
<scope>test</scope>
</dependency>

​runtime​​​依赖表示编译时不需要,但运行时需要。最典型的​​runtime​​依赖是JDBC驱动,例如MySQL驱动:

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
<scope>runtime</scope>
</dependency>

​provided​​​依赖表示编译时需要,但运行时不需要。最典型的​​provided​​依赖是Servlet API,编译的时候需要,但是运行时,Servlet服务器内置了相关的jar,所以运行期不需要:

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0</version>
<scope>provided</scope>
</dependency>

最后一个问题是,Maven如何知道从何处下载所需的依赖?也就是相关的jar包?答案是Maven维护了一个*仓库(​​repo1.maven.org​​),所有第三方库将自身的jar以及相关信息上传至*仓库,Maven就可以从*仓库把所需依赖下载到本地。

Maven并不会每次都从*仓库下载jar包。一个jar包一旦被下载过,就会被Maven自动缓存在本地目录(用户主目录的​​.m2​​目录),所以,除了第一次编译时因为下载需要时间会比较慢,后续过程因为有本地缓存,并不会重复下载相同的jar包。

六、插件和目标

①插件

Maven 的核心程序仅仅负责宏观调度,不做具体工作。具体工作都是由 Maven 插件完成的。例如:编译就是由 maven-compiler-plugin-3.1.jar 插件来执行的。

#②目标

一个插件可以对应多个目标,而每一个目标都和生命周期中的某一个环节对应。

Default 生命周期中有 compile 和 test-compile 两个和编译相关的环节,这两个环节对应 compile 和 test-compile 两个目标,而这两个目标都是由 maven-compiler-plugin-3.1.jar 插件来执行的。

七、仓库

  • 本地仓库:在当前电脑上,为电脑上所有 Maven 工程服务
  • 远程仓库:需要联网
  • 局域网:我们自己搭建的 Maven 私服,例如使用 Nexus 技术。
  • Internet
  • *仓库
  • 镜像仓库:内容和*仓库保持一致,但是能够分担*仓库的负载,同时让用户能够就近访问提高下载速度,例如:Nexus aliyun

建议:不要*仓库和阿里云镜像混用,否则 jar 包来源不纯,彼此冲突。

专门搜索 Maven 依赖信息的网站:https://mvnrepository.com/