Maven 的基础概念:
* Maven 的介绍:
* Maven 是 Apache 旗下一个开源项目管理工具,他是采用纯 java 编写的,它采用了一种被称之为
* Project Object Model(POM:项目对象模型)的概念来管理项目,所有的项目配置信息都被定义在
* 一个叫做 pom.xml 的文件中,通过该文件 Maven 可以管理项目的整个生命周期,包括清除、编译、
* 测试、报告、打包、部署等。目前 Apache 下绝大多数项目都已采用 Maven 进行管理,而 Maven
* 本身还支持多种插件,可以更方便更灵活的控制项目,可以让开发人员花费更多的精力在业务功能上,
* 而不是把时间浪费在 jar 包的管理,和项目的部署上。
*
* Maven 能解决的问题:
* 软件开发中遇到的问题:
* 1、jar 包的依赖和管理:
* 项目中有很多 jar 包,可能会存在下面的几个问题:
* 不能确定 jar 包的完全正确性;
* 不同技术框架版本的管理;
* jar 包的依赖关系;
* 2、项目的自动构建:
* 软件开发:可行性分析、需求分析、软件设计、软件开发、发布、运维;
* 软件构建:软件已经开发完毕,需要构建成一个产品进行发布;
* 构建步骤(也可以叫做软件构建的生命周期):
* 清除-->编译-->测试-->报告-->打包(jar/war)-->安装-->部署到远程;
* Maven 就是用来解决上面的问题的,即对 jar 包的管理,和对项目的构建;
* maven 可以通过一个命令实现自动构建软件项目(具体命令下面介绍);
*
* Maven 与 ant、svn 的区别:
* 1、maven 与 ant 之间的区别:
* 都是软件构建工具、软件管理工具,maven 比 ant 更加强大,已经取代了 ant;
* ant 只能用来进行软件项目的构建;
* 2、maven 与 svn 的区别:
* maven 是一种软件构建工具,是软件已经开发完毕,对软件进行构建、部署 和 发布;
* svn 是版本控件工具,是一种团队协同开发工具;
* svn 也有一个仓库,功能是:
* 1、保存软件项目的源码;
* 2、历史版本的备份;
* 3、每一次版本的修改情况;
*
* Maven 是一个工具,是一个软件,需要先从官网下载下来;
* 我下载的是 apache-maven-3.6.1-bin.zip
Maven 软件目录的介绍:
1、bin:存放一些 maven 可执行的命令(比如 mvn 等);
2、boot:里面只有一个文件 plexus-classworlds-2.6.0.jar;
该文件是 jar 包下载引擎,即 maven 就是通过该文件进行 jar 包下载的;
既可以下载项目中依赖的 jar 包,也可以下载 maven 进行软件构建的插件(比如清除插件、编译插件、打包插件等);
注意:maven 默认情况下是没有集成这些插件的,使用的时候需要自行下载;
3、conf:里面有一个配置文件 settings.xml,用于配置本地仓库地址;
maven 默认配置的本地仓库地址为 ${user.home}/.m2/repository
如果不想把 maven 下载的 jar 包放在默认的仓库地址中,可以自己手动配置 maven 仓库地址,如下所示:
项目中使用 maven 管理 jar 包,会先到 maven 本地仓库中查找是否有需要的 jar 包,如果有,就直接在项目中使用;
如果在 maven 本地仓库中没有找到项目需要的 jar 包,maven 会到中心仓库中把需要的 jar 包下载到本地仓库中;
maven 中心仓库是面向全球的,里面有所有的 jar 包,以及对应的各个版本。
4、lib:存放一些共享库,maven 软件依赖的 jar 包;
Maven 环境变量的配置:
测试环境变量是否配置成功:maven -v
在 IntelliJ IDEA 上配置 maven:
如果 IDEA 已经打开了一个项目,在 File->Settings->Build, Execution, Deployment->Maven 下配置的 maven,那么只在当前项目有效;即创建新的项目后,maven 配置又会恢复为默认值;
打开项目的情况下,永久配置 maven 的方法是在 File->Other Settings->Settings for new Projects->Build, Execution, Deployment->Maven 下进行配置;
我用的是 IDEA 2018.3,是上面那样配置的;有些版本是下面这样配置的:
使用 IntelliJ IDEA 创建 maven 项目:
创建完成的项目结构为:
src/main/java:存放的是项目中的源码文件;
src/main/resources:存放的是资源文件,或者项目的配置文件;
src/test/java:存放的是项目中用于测试的源码文件;
src/test/resources:存放的是测试用的资源文件,或配置文件;
target:项目构建后(编译、打包、发布)后,会将生产的文件存放在这个目录;这个目录是自动生成的;
pom.xml:Project Object Model,项目对象模型,是 maven 的核心配置文件;
MavenDemo.java 类:
package com.maven.demo;
public class MavenDemo {
public String getString(){
return "hello maven";
}
}
MavenTest.java 类:
package com.maven.demo;
import org.junit.Test;
public class MavenTest {
@Test
public void test(){
MavenDemo demo = new MavenDemo();
String str = demo.getString();
System.out.println(str);
}
}
pom.xml 依赖了一个 junit:
<?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.maven.demo</groupId>
<artifactId>mavendemo</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 声明 jar 包的依赖,依赖的是 junit4.12 的 jar 包 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
使用 Maven 命令对软件项目进行构建(生命周期):
在 IDEA 自带的 Terminal 终端下执行命令:
注意:默认情况下 maven 是没有集成构建的插件的,执行下面的命令时,maven 会自动下载对应的插件(有些插件 IDEA 会自动帮我们下载,而有些插件,在我们使用的时候才会下载);
1、编译:通过 mvn compile 命令执行(第一次执行时会自动下载 maven 的编译插件),生成 classes 字节码文件;
2、测试:通过 mvn test 命令执行,会自动执行 src/test/java 下的测试类;
3、打包:通过 mvn package 命令执行,将当前项目打包生成一个 jar 文件;
4、安装:通过 mvn install 命令执行,将 jar 包安装到本地仓库,供别的项目调用;
5、清除:通过 mvn clean 命令执行,删除 target 目录,及其下的字节码文件;
6、验证:通过 validate 命令执行,验证项目是否正确,并且所有必须信息都是可用的;
7、检查:通过 verify 命令执行,对集成测试的结果进行检查,以保证质量达标;
8、发布(部署):通过 mvn deploy 命令执行,将当前项目发布到中央仓库,或者私服(私有服务器)中,供其他人调用。
9、生成站点:通过 mvn site 命令执行,生成当前项目的站点(Web Site)信息、报告文档;
注意:上面是在命令行通过 maven 命令对项目进行构建的;
当然,使用 IDEA 工具也可以直接对项目进行构建,双击下面 maven 对应的命令,IDEA 就会自动执行该命令。
思考:maven 是从什么地方下载第三方依赖的 jar 包,或者生命周期的插件的?
在 maven 的 lib 目录下有一个 maven-model-builder-3.6.1.jar 文件(不同的 maven 版本对应该文件的版本也不一样);
解压该文件,在 maven-model-builder-3.6.1\org\apache\maven\model 路径下有一个 pom-4.0.0.xml 配置文件;
该配置文件中有一个 <repositories> 节点,配置的就是下载第三方依赖 jar 包的地址(maven 中心仓库):
该配置文件中还有一个 <pluginRepositories> 节点,配置的就是下载 maven 生命周期插件的地址:
maven 下载的 jar 包或者插件存放在本地仓库中;本地仓库的位置在 maven 软件的 conf 目录下的 settings.xml 中配置:
(上面已经配置过了)
Maven 仓库的概念:
1、本地仓库:localRepository
在 maven 软件的 conf 目录下的 settings.xml 中配置;
2、公司私服仓库:存放在公司局域网的服务器中;
使用 nexus 软件来发布 maven 私服;
3、 中心仓库:面向全球的
http://repo.maven.apache.org/maven2/
Maven 坐标的概念:
当项目中使用 maven 管理 jar 包时,maven 会从中心仓库下载项目所依赖的 jar 包;
那么,maven 中心仓库有那么多 jar 包,它怎么知道要下载哪一个 jar 包呢?
这就使用到坐标的概念,maven 使用一个坐标来唯一标识一个 jar 包;
坐标的组成:groupId + artifactId + version;
1、groupId:组 id,一般用来标识该 jar 包属于哪个公司,或者哪个结构(比如 org.apache);
2、artifactId:构建物 id,一般用来标识产品名,或产品的 id(比如 struts2,spring);
3、version:版本号;
groupId + artifactId + version 组成的坐标就可以用来唯一标识一个 jar 包;
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 版本 -->
<modelVersion>4.0.0</modelVersion>
<!--
坐标:maven 使用坐标的概念来唯一定位一个 jar 包
坐标 = groupId + artifactId + version
groupId:组id,一般用来表示一个组织,或者机构,或者公司的 包名;
artifactId:产品id;
version:版本;
SNAPSHOT 表示测试版本(或者叫镜像版本);
RELEASE 表示发行版本(或者叫最终版本);
-->
<groupId>com.maven.demo</groupId>
<artifactId>mavendemo</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 表示发布的是 jar 包,可以不写(默认就是 jar 包) -->
<packaging>jar</packaging>
<!-- 项目名称:可以不写 -->
<name>mavendemo</name>
<!-- 项目所依赖的 jar 包,可以有多个 -->
<dependencies>
<!-- 声明 jar 包的依赖,依赖的是 junit4.12 的 jar 包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!--
依赖的 jar 包的使用范围:
test:表示测试的时候使用该 jar 包,即发布以后就不能使用该 jar 包了;
compile:表示编译的时候使用该 jar 包,即将该 jar 包编译到项目中;
如果 scope 不写,默认 jar 包的使用范围就是 compile;
-->
<scope>test</scope>
</dependency>
</dependencies>
</project>