Maven简介及安装
Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理。Maven 这个单词的本意是:专家,内行。
构建过程的几个主要环节
- 清理:删除以前的编译结果,为重新编译做好准备
- 编译:将java源程序编译为字节码文件
- 测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性
- 报告:在每一个测试后以标准的格式记录和展示测试结果
- 打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。java工程对应jar包,web工程对应war包
- 安装:在Maven环境下特指将打包的结果-jar包或war包安装到本地仓库中
- 部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行
安装
下载maven安装包解压最好不要有中文空格目录
配置环境变量
M2_HOME D:\java\apache-maven-3.6.0
path %M2_HOME%\bin
查看Maven版本信息验证安装是否正确
cmd 命令窗口下mvn -v
修改maven配置文件
53行配置maven位置下载位置
<localRepository>D:\java\apache-maven-3.6.0\localRespository</localRepository>
146行配置国内阿里云下载
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
218行配置jdk
<profiles>
<profile>
<id>development</id>
<activation>
<jdk>1.8</jdk>
<activeByDefault>true</activeByDefault>
</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>
</profiles>
几个基本的Maven命令
mvn compile 编译
mvn clean 清理
mvn test 测试
mvn package 打包
运行Maven命令时一定要进入pom.xml文件所在的目录!
Maven核心概念
- POM:项目对象模型,pom.xml是maven工程的核心配置文件,相当于web工程中的web.xml
- 约定的目录结构
- 坐标:maven中的坐标使用三个向量在仓库中唯一定位一个maven工程
1.groupid:公司或组织域名倒序+项目名称
2.artifactid:模块名
3.version:版本号 - 依赖管理
Maven中最关键的部分,使用Maven最主要的是使用它的依赖管理功能。
1.依赖的目的
当Ajar包用到了Bjar包中的某些类时,A就对B产生了依赖,在项目中以依赖的方式引入一个我们需要的jar包就是使用 dependency 标签指定被依赖 jar 包的坐标就可以了。
<dependency>
<groupId>com.yxm.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
2.依赖的范围
目标 jar 包的坐标还有一个 scope 设置,这是依赖的范围。依赖的范 围有几个可选值,我们用得到的是:compile、test、provided 三个。
从项目结构角度理解 compile 和 test 的区别
从开发和运行这两个不同阶段理解compile和provided的区别
有效性总结
compile | test | provided | |
---|---|---|---|
主程序 | √ | × | √ |
测试程序 | √ | √ | √ |
参与部署 | √ | × | × |
3.依赖的排除
如果我们在当前工程中引入了一个依赖是A,而A又依赖了B,那么Maven会自动将A依赖的B引入当前工程,但是个别情况下B有可能是一个不稳定版,或对当前工程有不良影响。这时我们可以在引入A的时候将B排除。
<dependency>
<groupId>com.yxm.maven</groupId>
<artifactId>HelloFriend</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
4.统一管理所依赖 jar 包的版本
对同一个框架的一组 jar 包最好使用相同的版本。为了方便升级框架,可以将 jar 包的版本信息统一提
取出来统一声明版本号
<properties>
<yxm.spring.version>4.1.1.RELEASE</yxm.spring.version>
</properties>
其中 yxm.spring.version 部分是自定义标签。引用前面声明的版本号
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${yxm.spring.version}</version>
</dependency>
……
</dependencies>
设置中文编码为UTF-8
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
-
仓库管理
本地仓库:为当前本机电脑上的所有 Maven 工程服务。
远程仓库:(1)私服:架设在当前局域网环境下,为当前局域网范围内的所有 Maven 工程服务。
(2)中央仓库:架设在 Internet 上,为全世界所有 Maven 工程服务。
(3)中央仓库的镜像:架设在各个大洲,为中央仓库分担流量。减轻中央仓库的压力,同时更快的响应用户请求。 -
生命周期
-
插件和坐标
-
继承
-
聚合
生命周期
我们开发一个项目的时候,通常有这些环节:创建项目、编写代码、清理已编译的代码、编译代码、执行单元测试、打包、集成测试、验证、部署、生成站点等,这些环节组成了项目的生命周期,这些过程也叫做项目的构建过程。
maven出来之后,项目生命周期中的这些环节都被简化了,被规范化了。这些都是maven约定好的,所以清理代码用一个命令mvn clean就可以完成,不需要我们去配置清理的目标目录;用mvn compile命令就可以完成编译的操作;用mvn test就可以自动运行测试用例;用mvn package就可以将项目打包为jar、war格式的包,能够如此简单,主要还是maven中约定大于配置的结果。
Maven 有三套相互独立的生命周期,分别是:
①Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
②Default Lifecycle 构建的核心部分,编译,测试,打包,安装,部署等等。
③Site Lifecycle 生成项目报告,站点,发布站点。
它们是相互独立的,你可以仅仅调用 clean 来清理工作目录,仅仅调用 site 来生成站点。当然你也可以
直接运行 mvn clean install site 运行所有这三套生命周期。
每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比
如,运行 mvn clean,这个 clean 是 Clean 生命周期的一个阶段。有 Clean 生命周期,也有 clean 阶段。
clean生命周期
clean生命周期的目的是清理项目,它包含三个阶段:
生命周期阶段 | 描述 |
---|---|
pre-clean | 执行一些需要在clean之前完成的工作 |
clean | 移除所有上一次构建生成的文件 |
post-clean | 执行一些需要在clean之后立刻完成的工作 |
用户可以通过mvn pre-clean来调用clean生命周期中的pre-clean阶段需要执行的操作。
调用mvn post-clean会执行上面3个阶段所有的操作,上文中有说过,每个生命周期中的后面的阶段会依赖于前面的阶段,当执行某个阶段的时候,会先执行其前面的阶段。
default生命周期
这个是maven主要的生命周期,主要被用于构建应用,包含了23个阶段。
生命周期阶段 | 描述 |
---|---|
validate | 校验:校验项目是否正确并且所有必要的信息可以完成项目的构建过程。 |
initialize | 初始化:初始化构建状态,比如设置属性值。 |
generate-sources | 生成源代码:生成包含在编译阶段中的任何源代码。 |
process-sources | 处理源代码:处理源代码,比如说,过滤任意值。 |
generate-resources | 生成资源文件:生成将会包含在项目包中的资源文件。 |
process-resources | 编译:复制和处理资源到目标目录,为打包阶段最好准备。 |
compile | 处理类文件:编译项目的源代码。 |
process-classes | 处理类文件:处理编译生成的文件,比如说对Java class文件做字节码改善优化。 |
generate-test-sources | 生成测试源代码:生成包含在编译阶段中的任何测试源代码。 |
process-test-sources | 处理测试源代码:处理测试源代码,比如说,过滤任意值。 |
generate-test-resources | 生成测试源文件:为测试创建资源文件。 |
process-test-resources | 处理测试源文件:复制和处理测试资源到目标目录。 |
test-compile | 编译测试源码:编译测试源代码到测试目标目录. |
process-test-classes | 处理测试类文件:处理测试源码编译生成的文件。 |
test | 测试:使用合适的单元测试框架运行测试(Juint是其中之一)。 |
prepare-package | 准备打包:在实际打包之前,执行任何的必要的操作为打包做准备。 |
package | 打包:将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。 |
pre-integration-test | 集成测试前:在执行集成测试前进行必要的动作。比如说,搭建需要的环境。 |
integration-test | 集成测试:处理和部署项目到可以运行集成测试环境中。 |
post-integration-test | 集成测试后:在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境。 |
verify | 验证:运行任意的检查来验证项目包有效且达到质量标准。 |
install | 安装:安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。 |
deploy | 部署:将最终的项目包复制到远程仓库中与其他开发者和项目共享。 |
site生命周期
site生命周期的目的是建立和发布项目站点,Maven能够基于pom.xml所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息。主要包含以下4个阶段:
阶段 | 描述 |
---|---|
pre-site | 执行一些需要在生成站点文档之前完成的工作 |
site | 生成项目的站点文档 |
post-site | 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备 |
site-deploy | 将生成的站点文档部署到特定的服务器上 |
Maven插件
●Maven 的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。
●每个插件都能实现多个功能,每个功能就是一个插件目标。
●Maven 的生命周期与插件目标相互绑定,以完成某个具体的构建任务。
例如:compile 就是插件 maven-compiler-plugin 的一个目标;pre-clean 是插件 maven-clean-plugin 的一个目标。
自定义Maven插件
maven中的插件是有很多目标(goal)组成的,开发插件,实际上就是去编写插件中目标的具体代码。每个目标对应一个java类,这个类在maven中叫做MOJO,maven提供了一个Mojo的接口,我们开发插件也就是去实现这个接口的方法,这个接口是:
org.apache.maven.plugin.Mojo
接口有3个方法:
void execute() throws MojoExecutionException, MojoFailureException;
void setLog( Log log );
Log getLog();
execute:这个方法比较重要,目标的主要代码就在这个方法中实现,当使用mvn命令调用插件的目标的时候,最后具体调用的就是这个方法。
setLog:注入一个标准的Maven日志记录器,允许这个Mojo向用户传递事件和反馈
getLog:获取注入的日志记录器
实现一个插件的具体步骤:
1、 创建一个maven构件,这个构件的packaging比较特殊,必须为maven-plugin,表示这个构件是一个插件类型,如下:
pom.xml中的packageing元素必须如下值:
<packaging>maven-plugin</packaging>
2、导入maven插件依赖:
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.4</version>
<scope>provided</scope>
</dependency>
3、创建一个目标类,需要继承org.apache.maven.plugin.AbstractMojo
4、目标类中添加注解@Mojo注解:
@org.apache.maven.plugins.annotations.Mojo(name="目标名称")
注意@Mojo注解用来标注这个类是一个目标类,maven对插件进行构建的时候会根据这个注解来找到这个插件的目标,这个注解中还有其他参数,后面在详细介绍。
5、在目标类的execute方法中实现具体的逻辑
6、安装插件到本地仓库:插件的pom.xml所在目录执行下面命令
mvn clean install
7、让使用者去使用插件
最后:总结一个我面试的时候一个面试题除了clean和package命令你还使用过哪些命令?
- 创建Maven的普通java项目:
mvn archetype:create
-DgroupId=packageName
-DartifactId=projectName - 创建Maven的Web项目:
mvn archetype:create
-DgroupId=packageName
-DartifactId=webappName
-DarchetypeArtifactId=maven-archetype-webapp - 编译源代码: mvn compile
- 编译测试代码:mvn test-compile
- 运行测试:mvn test
- 产生site:mvn site
- 打包:mvn package
- 在本地Repository中安装jar:mvn install
- 清除产生的项目:mvn clean
- 生成eclipse项目:mvn eclipse:eclipse
- 生成idea项目:mvn idea:idea
- 组合使用goal命令,如只打包不测试:mvn -Dtest package
- 编译测试的内容:mvn test-compile
- 只打jar包: mvn jar:jar
- 只测试而不编译,也不测试编译:mvn test -skipping compile -skipping test-compile
( -skipping 的灵活运用,当然也可以用于其他组合命令) - 清除eclipse的一些系统设置:mvn eclipse:clean