Maven的概念与Maven项目的创建
Maven
- Maven的概念
- 依赖管理
- 项目构建
- Maven安装
- Maven项目的创建
- Maven的第一个项目
- Maven的第二个项目
Maven的概念
Maven 是 Apache 基金会推出的跨平台的项目管理工具,主要服务于基于Java平台的项目构建、依赖管理和项目信息管理,目前是 Java 生态中最主流的构建工具之一。
Maven简化了 Java 应用程序的打包、测试和部署。借助 Maven,开发人员可以使用预定义的生命周期和项目结构更轻松地管理复杂的项目。
maven官方文档:https://maven.apache.org/
依赖管理
什么是依赖管理:
依赖管理是对第三方依赖包的管理,可以连接互联网下载项目所需第三方jar包,避免手动导入 JAR 包的繁琐和版本冲突。对自己开发的模块的管理,可以像引用第三方依赖包一样引用自己项目的依赖包。
项目构建
什么是项目构建:项目构建是一个从编写源代码到编译、测试、运行、打包、部署的过程。
理想的项目构建具有如下特点:高度自动化,跨平台,可重用的组件,标准化的流程
传统项目和maven项目构建的两种方式:
传统项目打开Idea编写源代码和配置文件,对源代码进行编译,可以使用Junit进行单元测试,把项目打成war包,部署到Tomcat服务器中运行。
maven项目是maven将项目构建过程进行标准化,每个阶段都可以使用一个命令来完成。
清理 --> 编译 --> 测试 --> 报告 --> 打包 --> 部署
maven项目构建的好处:
可以通过命令完成项目构建。例如测试使用mvn tomcat:run的命令来发布运行项目。
maven对每个构建阶段进行规范,有利于大型团队协作开发。
Maven的应用场景
开发人员只要按着maven标准的目录结构进行开发即可,然后提交代码,在测试服务器上拉取Java源码,然后可以使用maven的自动化项目构建完成项目的清理、编译、测试、打包和安装部署等。
为什么使用Maven
Ant?没有一个约定的目录结构,必须明确让ant做什么,什么时候做,然后编译,打包,没有生命周期,必须定义目标及其实现的任务序列,没有集成依赖管理;
Maven?拥有约定,知道你的代码在哪里,放到哪里去,拥有一个生命周期,例如执行 mvn install 就可以自动执行编译,测试,打包等构建过程,只需要定义一个pom.xml,然后把源码放到默认的目录,Maven帮你处理其他事情,拥有依赖管理,仓库管理。
Maven概念模型
- POM 文件:项目对象模型 POM 文件是 XML 文件,其中包含与项目相关的信息和配置信息,执行 Maven 命令时,需要为 Maven 提供一个 POM 文件来执行命令,Maven 读取pom.xml文件以完成其配置和操作。
- 依赖项和存储库:依赖项是项目所需的外部 Java 库,存储库是打包的 JAR 文件的目录。本地存储库只是机器硬盘驱动器上的一个目录,如果在本地 Maven 存储库中找不到依赖项,Maven 会从中央 Maven 存储库下载它们并将它们放在本地存储库中。
- 构建生命周期、阶段和目标:Maven 命令通常指构建生命周期、阶段或目标,如果使用 Maven 命令执行生命周期,则该生命周期中的所有构建阶段也会执行,如果执行构建阶段,则还会执行定义序列中的所有先前阶段。
- 构建配置文件:构建配置文件是一组配置值,允许使用不同的配置构建项目。例如为本地开发、测试或生产构建项目,要启用这些构建,可以在使用其元素中定义不同的构建配置文件。
- 构建插件:构建插件用于执行特定目标,可以向文件添加插件 ,Maven 提供标准插件,还可以在 Java 中实现自定义插件。
Maven安装
安装准备:安装jdk1.8或以上版本
下载Maven官网:http://maven.apache.org/download.html
下载地址:https://archive.apache.org/dist/maven/maven-3/3.6.0/binaries/
版本是Maven3.6,安装Maven解压到相应目录即可(无中文路径)
Maven安装目录分析
bin:可执行命令存放地,包含 Maven 的启动脚本,是调用 Maven 命令的入口。
boot:含有plexus-classworlds类加载器框架,负责加载 Maven 核心类
conf:全局配置目录,存放 Maven 的全局配置文件,对当前机器上所有使用该 Maven 的项目生效(优先级低于项目本地配置),含有 settings.xml Maven 核心配置文件,可配置本地仓库路径、远程仓、代理、镜像、认证信息等。
lib:Maven 运行依赖库,包含 Maven 自身运行所需的所有 Jar 包(如核心类库、依赖的第三方组件),无需手动修改或添加。
LICENSE.txt, NOTICE.txt, README.txt针对Maven版本,第三方软件等简要介绍
Maven的环境变量
配置Maven的环境变量的意义是为了让Maven下的bin目录下的所有可执行程序在任意位置都可以执行
JAVA_HOME 必须配置,Maven 是基于 Java 开发的工具,必须依赖 JDK 才能运行,JAVA_HOME 用于指定 JDK 的安装路径,需指向 JDK 根目录,编辑器在读取本机Maven的时候,先找JAVA_HOME,若不设置JAVA_HOME直接设置JAVA 的 PATH 变量,在cmd运行时可能会有报错
设置MAVEN_HOME环境变量,把maven的解压后的路径添加为变量值,指向 Maven 的安装根目录,用于统一管理 Maven 路径(后续配置 PATH 时会引用此变量,方便后续升级 Maven 时只需修改此处)
PATH 系统的环境变量,用于指定可执行程序的搜索路径,将 Maven 的 bin 目录添加到 PATH 后,即可在任意目录下直接使用 mvn 命令。
配置值需包含 Maven 的 bin 目录路径,通常通过引用 MAVEN_HOME 简化配置
配置用户范围的settings.xml:
默认的配置文件是 ~/.m2/settings.xml 单个用户的,定义当前用户专属的 Maven 规则,仅对当前登录的用户生效,且会覆盖全局配置中相同的项;
%MAVEN_HOME%/conf/settings.xml 全局的,定义当前机器的全局 Maven 规则,所有使用该 Maven 安装包的用户都会遵循此配置。
想让所有用户共用配置如公司 / 团队统一规则,那么修改 %MAVEN_HOME%/conf/settings.xml,
想做个人专属配置如个人镜像、账号,那么在 ~/.m2 下创建并修改 settings.xml
验证配置是否完成
Maven项目的创建
Maven的第一个项目
按照约定创建Maven项目目录
src/main/java —— 存放项目的.java文件
src/main/resources —— 存放项目资源文件,如spring, mybatis配置文件
src/test/java —— 存放所有测试.java文件,如JUnit测试类
src/test/resources —— 测试资源文件
target —— 项目输出位置
pom.xml —— 项目配置文件
在项目Hello根目录建立pom.xml
在src/main/java/cn/tx/maven目录下新建文件Hello.java
package cn.tx.maven;
public class Hello {public String sayHello(String name){return "Hello "+name+"!";}
}
在/src/test/java/cn/tx/maven目录下新建测试文件HelloTest.java
package cn.tx.maven;
import org.junit.Test;
import static junit.framework.Assert.*;
public class HelloTest {@Testpublic void testHello(){Hello hello = new Hello();String results = hello.sayHello("maven");assertEquals("Hello maven!",results); }
}
进行maven的项目操作
- 打开cmd命令行,进入Hello项目根目录执行 mvn compile命令,执行默认生命周期的 compile 阶段,编译项目的主源码 src/main/java 目录,编译后的 class 文件会输出到 target/classes 目录;
- cmd 中继续录入mvn clean命令,执行清洁生命周期的 clean 阶段,删除项目的 target 目录(该目录存放编译、打包等操作的输出文件),用于清理之前的构建产物;
- cmd 中录入 mvn clean compile命令,先执行 clean 清理旧产物,再执行 compile 重新编译源码,相当于 “先清理后编译”,确保基于最新代码构建;
- cmd 中录入 mvn clean test命令,先清理,再执行默认生命周期的 test 阶段(会自动执行 compile 编译主源码,再编译测试源码 src/test/java,最后运行测试用例),测试结果会输出到 target/surefire-reports 目录;
- cmd 中录入 mvn clean package命令,先清理,再执行 package 阶段(会依次执行 compile、test 等前置阶段),将项目打包为指定格式,打包产物存放在 target 目录下;
- cmd 中录入 mvn clean install 查看仓库会把项目安装到仓库里,先清理,再执行 install 阶段(包含 package 及之前的所有阶段),除了打包外,还会将打包产物安装到本地 Maven 仓库,供本地其他项目通过依赖引用该项目。
Maven的第二个项目
按照约定创建Maven项目目录
在项目HelloFriend根目录建立pom.xml
<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>cn.tx.maven</groupId><artifactId>HelloFriend</artifactId><version>0.0.1-SNAPSHOT</version><name>HelloFriend</name><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.9</version><scope>test</scope></dependency> <dependency><groupId>cn.tx.maven</groupId><artifactId>Hello</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope><optional>true</optional></dependency> </dependencies>
</project>
在src/main/java/cn/tx/maven目录下新建文件HelloFriend.java
package cn.tx.maven;
import cn.tx.maven.Hello;public class HelloFriend {public String sayHelloToFriend(String name){Hello hello = new Hello();String str = hello.sayHello(name)+" I am "+this.getMyName();System.out.println(str);return str;}public String getMyName(){return "John";}
}
在/src/test/java/cn/tx/maven目录下新建测试文件HelloFriendTest.java
package cn.tx.maven;
import static junit.framework.Assert.assertEquals;
import org.junit.Test;
import cn.tx.maven.Hello;public class HelloFriendTest {@Testpublic void tesHelloFriend(){ HelloFriend helloFriend = new HelloFriend();String results = helloFriend.sayHelloToFriend("zhangsan");assertEquals("Hello zhangsan! I am John",results); }
}
在HelloFriend目录下执行命令mvn package
若把仓库里第一个项目Hello的 jar 包删除的话,再在HelloFriend目录下执行命令mvn package,系统会又报错提示:Could not find artifact cn.tx.maven:Hello:jar:0.0.1-SNAPSHOT,表示无法找到HelloFriend所依赖的Hello 0.0.1-SNAPSHOT.jar,我们需要重新构建第一个项目Hello并安装到数据仓库,在命令行Hello根目录下执行mvn clean install 才可以