项目构建工具--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)构建工具,依赖管理工具、项目管理工具

 (3)提供中央仓库,可自动下载软件、依赖

--基于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一个个去编译。插件就相当于小程序(其实是脚本)

posted @ 2021-06-22 21:56  meiyouyou  阅读(313)  评论(0)    收藏  举报