项目构建工具--Maven
1.基础
--项目构建:完成工程发布流程需要的一系列步骤,包括编译、测试、打包、部署等
--Eclipse和IDEA这些IDE可进行项目构建,但其体积大且基本都是GUI,一般后端无显示器,so还是需专门做项目构建工具支持
--传统构建工具Ant,需编写build.xml来配置任务流程
--新兴构建工具gradle,以android为典型,基本现在所有android项目都采用gradle作项目构建工具;配置写在build.gradle文件中
--主流构建工具Maven
(1)基于约定优于配置原则(约定的一些规范无需再配置)的项目构建工具
(2)maven功能:依赖管理,规范目录结构,完整的项目构建阶段,支持多种插件,方便集成(可集成在IDE中)
--通过配置profile根据环境的不同读取不同的配置文件
--基于pom(project object model)文件进行,项目所有的配置信息在pom.xml文件中
2.详解
--Maven特性
(1)自动化构建、跨平台、对外提供一致的操作接口
(2)构建工具,依赖管理工具、项目管理工具
--基于java,安装前先安装jdk,后官网下载软件版本->解压到目录->设置环境变量HOME/PATH->验证cmd mvn -V
--maven目录
bin目录:包含mvn运行的脚本
boot目录:只有plexus-classworlds-2.6.0.jar文件,一个类加载器框架,maven使用该框架加载自己的类库
conf目录:主settings.xml文件,可全局定制maven行为
lib目录:所有maven运行时需要的java类库
--pom.xml说明
XML头:指定了xml文档的版本与编码方式
project是所有pom.xml的根元素,声明了一些与pom相关的命名空间及xsd元素
modelversion指定了当前pom模型的版本
groupid定义项目属于哪个组
artifactid定义当前maven项目在组中唯一id
version项目当前版本(snapshot意为快照,说明该项目处于开发中,不稳定,该GAV找到项目)
name声明了一个更友好的项目名称,非必须
packaging代表打包方式(pom jar war ear 默认为jar)
properties全局属性的配置
dependencies对依赖的管理 groupID实际项目 artifactID模块 version版本 GAV基本坐标 找到依赖
scope 范围
--依赖范围用来控制依赖和三种classpath(编译classpath,测试classpath,运行classpath)的关系
(1)compile 编译依赖范围,默认,对编译,测试,运行classpath都有效,即编译,测试和运行时都需要使用此依赖
(2)test 测试依赖范围,只在编译测试代码及运行测试时需要
(3)provided 已提供依赖范围
(4)runtime 运行时依赖范围
(5)system 系统依赖范围,必须通过systempath元素显示地指定依赖文件路径
(6)import 导入依赖范围,不会对3种classpath产生实际影响
--构件:maven中,任何一个依赖、插件或项目构建的输出,都可以称为构件,maven中的坐标可定位到某一构件
--仓库
(1)仓库就是统一存储构件的位置,为了实现重用,项目构建完成后生成的构件可安装或部署到仓库,供其他项目使用
(2)任何一个构件都有其唯一坐标,由该坐标可定义其在仓库中唯一存储路径
(3)maven仓库基于简单文件系统存储的
(4)maven仓库分为本地仓库,远程仓库(中央仓库(默认),私服,其他公共库)
用户本地默认仓库 ~/.m2/repository,默认下,~/.m2/settings.xml文件是不存在的,需从maven安装目录copy过去进行编辑
maven的安装文件自带了中央仓库的配置
私服
1 架设在局域网内的仓库服务
2 代理广域网上的远程仓库,供局域网maven用户使用
3 maven下载构件时,从私服请求,若私服不存在则从远程仓库下载,缓存到私服,再为请求提供服务
4 一些无法从外部下载的构件也能从本地上传到私服供大家使用
--远程仓库的配置
一般使用默认的中央仓库(访问速度慢,有些无构件)
Nexus一种远程仓库(maven依赖的jar包下载)
可在pom.xml或settings.xml(我们项目)文件中配置
repository: 在repositorys元素下,可使用repository子元素声明一个或多个远程仓库
id: 仓库声明的唯一id,中央仓库id为central,若中央仓库也声明该id,会覆盖中央仓库配置
name: 仓库名称
url: 指向仓库地址
release(发布版) snapshots(快照版本) true/false
远程仓库的认证:认证信息必须配置在settings.xml文件中 <servers>下<server> id 该id须与远程仓库repository中id一致 username/password
--设置http代理:编辑settings.xml文件<proxies>下<proxy>
--镜像
仓库x可提供仓库y存储的所有内容,则x是y的一个镜像
国内镜像:阿里云镜像 配置在settings.xml文件中 <mirrors> 下<mirror> <mirrorof>central</mirrorof>配置为中央仓库的镜像,任何对中央仓库的请求都转发至该镜像 <mirrorof>*</mirrorof>匹配所有远程仓库 由于镜像仓库完全屏蔽了被镜像仓库,当镜像仓库不稳定或停止服务时,maven仍无法访问被镜像仓库(配置镜像仓库的情况)
若只配置远程仓库,无配置镜像,当在远程仓库搜索不到会继续去远程中央仓库搜索和下载
--标准项目结构
src/main/java java代码目录
src/main/resources 配置文件目录
src/main/webapp webapp根目录
src/test/java 测试代码目录
src/test/resources 测试配置目录
target/classes 代码编译结果目标目录
target /test-classes 测试代码编译结果目标目录
自定义目录结构需在pom.xml文件中<build>-><plugin>中配置
--项目构建流程(构建生命周期)
validate 验证项目级相关信息是否正确
compile 编译源代码和相关资源文件
test 对测试代码进行测试
package 根据不同项目类型进行打包
varife 验证打包的正确性
install 将打包好的包安装到本地
deploy 将打包好的包发布到远程仓中
--环境配置(dev test prod):<profiles> -> <profile>
--依赖和插件区别
(1)依赖的话就相当于你用java写代码时候引用的库文件。你之所以引用这些库是因为你需要它里面的函数,需要通过这些函数构建自己的代码
(2)插件呢,相当于你用word写文档时候最上面工具栏里面的工具,插件与你的文本本身不发生任何关系
(3)回到maven,依赖中被你调用过的函数会与你的代码一起进行编译
(4)插件来说呢,比如有些插件是帮助你进行编译工作的,你不用手动写javac一个个去编译。插件就相当于小程序(其实是脚本)

浙公网安备 33010602011771号