自动构建工具:Maven
- Maven是什么
- 安装
- 配置settings文件
- Maven核心概念
- 常用命令
- POM
- 坐标
- 依赖
- 生命周期
- clean生命周期
- default生命周期
- site生命周期
- 插件目标(Plugin Goal)
- 插件绑定:
- 自定义绑定:
Maven是什么
- maven是一款服务于java平台的自动化构建工具
Make——>Ant——>Maven——>Gradle - 构建:
1、以“java源文件”、“框架配置文件”、“JSP”、“HTML”、“图片”等资源为“原材料”,去“生产”一个可以运行运行的项目的过程
分为:编译、部署、构建
2、编译:JAVA源文件 .java——>编译——>.Class字节码文件——>交给JVM执行
3、部署:一个BS项目最终运行的并不是动态Web工程本身,而是这个动态Web工程的“编译结果”:web动态工程——>编译、部署——>编译结果
4、构建工程的各个环节:
清理:将以前编译得到的旧的class字节码文件删除,为下一次编译做准备
编译:将java源程序编译成class字节码文件
测试:自动测试,调用junit程序
报告:测试程序执行结果
打包:动态web工程打war包,java工程打jar包
安装:Maven特定的概念——将打包得到的文件复制到“仓库”中的指定位置
部署:将动态Web工程生成的war包复制到Servlet容器的指定目录下,使其可以运行
5、自动化构建:
安装
- 下载:Maven官网
- 下载后选择一个目录解析(最好不要有中文)
- 然后配置path环境变量,如图
- 系统变量:MAVEN_HOME = F:\dev\apache-maven-3.6.1
- 系统变量:path = %MAVEN_HOME%\bin
- 然后win+R 运行cmd 输入 mvn -version,如图所示则配置成功
配置settings文件
- 在Maven解压的文件目录下的config文件下,修改settings.xml文件
- 修改本地仓库位置
在settings.xml文件的52行写了默认仓库位置为: Default: ${user.home}/.m2/repository
将其修改为自定义的
<localRepository>E:/mymaven/repository</localRepository>
- 因为国外的服务器下载jar包很慢所以我们改为阿里云服务器(大约在150行左右)
</mirrors>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>central</id>
<name>Maven Repository Switchboard</name>
<url>http://repo1.maven.org/maven2/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>repo2</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo2.maven.org/maven2/</url>
</mirror>
<mirror>
<id>ibiblio</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://mirrors.ibiblio.org/pub/mirrors/maven2/</url>
</mirror>
<mirror>
<id>jboss-public-repository-group</id>
<mirrorOf>central</mirrorOf>
<name>JBoss Public Repository Group</name>
<url>http://repository.jboss.org/nexus/content/groups/public</url>
</mirror>
<mirror>
<id>google-maven-central</id>
<name>Google Maven Central</name>
<url>https://maven-central.storage.googleapis.com
</url>
<mirrorOf>central</mirrorOf>
</mirror>
<!-- 中央仓库在中国的镜像 -->
<mirror>
<id>maven.net.cn</id>
<name>oneof the central mirrors in china</name>
<url>http://maven.net.cn/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
- 在最后配置jdk,也要夹在两个profiles标签之间(我这里使用的为jdk8)
</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>
</profiles>
Maven核心概念
约定的目录结构
POM
坐标
依赖
仓库
生命周期/插件/目标
继承
聚合
常用命令
执行与构建过程相关的命令,必须进入pom.xml所在目录,与构建过程相关:编译、测试、打包
mvn clean:清理
mvn compile:编译主程序
mvn test-compile:编译测试程序
mvn test:执行测试
mvn package:打包
mvn install:安装(对于自己开发的maven工程需要进行install安装进入本地maven仓库)
mvn site:生成站点
POM
- pom:Project Object Model:项目对象模型
- pom.xml对于Maven工程是核心配置文件,与构建相关的一切设置都在这个文件进行配置。重要程度相当与web.xml之于动态web工程
坐标
Maven的坐标:使用下面三个向量在仓库中唯一定义一个Maven工程
<!--groupId:公司或组织域名的倒序+项目名-->
<groupId>com.fly.maven</groupId>
<!--artifactId:模块名-->
<artifactId>Java_Maven</artifactId>
<!--version:版本-->
<version>1.0-SNAPSHOT</version>
依赖
- Maven解析依赖信息时,会到本地仓库中查找被依赖的jar包
- 依赖范围
complie范围依赖
对主程序是否有效:有效
对测试程序是否有效:有效
是否参与打包:参与
test范围依赖
对主程序是否有效:无效
对测试程序是否有效:有效
是否参与打包:不参与
provided范围依赖
对主程序是否有效:有效
对测试程序是否有效:有效
是否参与打包:不参与
是否参与部署:不参与
生命周期
Maven定义了三套生命周期:clean、default、site,每个生命周期都包含了一些阶段(phase)。三套生命周期相互独立,但各个生命周期中的phase却是有顺序的,且后面的phase依赖于前面的phase。执行某个phase时,其前面的phase会依顺序执行,但不会触发另外两套生命周期中的任何phase。
clean生命周期
- pre-clean :执行清理前的工作;
- clean :清理上一次构建生成的所有文件;
- post-clean :执行清理后的工作
default生命周期
default生命周期是最核心的,它包含了构建项目时真正需要执行的所有步骤。
- validate
- initialize
- generate-sources
- process-sources
- generate-resources
- process-resources :复制和处理资源文件到target目录,准备打包;
- compile :编译项目的源代码;
- process-classes
- generate-test-sources
- process-test-sources
- generate-test-resources
- process-test-resources
- test-compile :编译测试源代码;
- process-test-classes
- test :运行测试代码;
- prepare-package
- package :打包成jar或者war或者其他格式的分发包;
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install :将打好的包安装到本地仓库,供其他项目使用;
- deploy :将打好的包安装到远程仓库,供其他项目使用;
site生命周期
- pre-site
- site :生成项目的站点文档;
- post-site
- site-deploy :发布生成的站点文档
插件目标(Plugin Goal)
一个插件往往能够完成多个任务。例如maven-dependency-plugin,它能够基于项目依赖做很多事情,例如分析项目依赖,帮助找出所有已解析的依赖等等,每个功能就是一个插件目标。用法是 <插件前缀:目标>。例如maven-dependency-plugin有十多个目标,最常用的:
mvn dependency:analyze
插件绑定:
Maven的生命周期与插件相互绑定,用以完成实际的构建任务。例如项目编译这一任务,它对应了default生命周期的compile阶段,而maven-compile-plugin这一插件的compile目标能完成该任务。因此,将它们绑定,就能实现编译的目的。
Maven在核心为一些主要的生命周期阶段绑定了很多插件的目标,当用户通过命令行调用生命周期阶段的时候,对于的插件目标就会执行相应的任务。例如clean绑定mavevn-clean-plugin:clean。
而default生命周期,由于项目的打包类型会影响构建的具体过程,因此,default生命周期的阶段与插件的目标绑定关系由项目打包类型所决定,通过POM中的packaging元素定义。最常用的打包类型是jar。以下是基于jar,default生命周期的内置插件绑定关系:
default生命周期还有很多其他阶段,默认它们没有绑定任何插件,因此也没有实际行为。
自定义绑定:
除了内置绑定以外,用户还能够自己选择将某个插件目标绑定到生命周期的某个阶段上。例如一个常用的插件 Maven Archetype Plugin,用户通过这个插件可以生成一个Maven项目的骨架,也可以从一个现成的项目中生成模板。
用户可以根据需要将任何插件目标绑定到任何生命周期的阶段,如:将maven-source-plugin的jar-no-fork目标绑定到default生命周期的package阶段,这样,以后在执行mvn package命令打包项目时,在package阶段之后会执行源代码打包,生成如:ehcache-core-2.5.0-sources.jar形式的源码包
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.6.3</version>
<executions>
<execution>
<id>attach-source</id>
<phase>package</phase><!-- 要绑定到的生命周期的阶段 -->
<goals>
<goal>jar-no-fork</goal><!-- 要绑定的插件的目标 -->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>