何为maven?
- Maven主要是基于Java平台的项目构建,依赖管理和项目信息
- Maven是优秀的构建工具,跨平台,消除构建的重复,抽象了一个完整的构建生命周期模型,标准化构建过程
- 管理分布的项目信息,版本控制系统,轻松获取项目文档,测试报告,静态分析报告,版本日志报告等
- 极限编程(XP)的搭配是非常不错的,比如持续集成(CI)
- 在Maven中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件,构件存储在仓库,(仓库就是存放依赖和插件的地方),任何的构件都有唯一的坐标,Maven根据这个坐标定义了构件在仓库中的唯一存储路径
maven安装配置
- 安装jdk
- 下载maven,到http://maven.apache.org/download.cgi下载如:
apache-maven-3.5.3-bin.zip - 配置环境变量
- 查看mvn –v
注:maven需要先安装好jdk
maven目录结构
bin:该目录包含了mvn运行的脚本,这些脚本用来配置Java命令,还包含了m2.conf文件,这是classworlds的配置文件
boot:就包含了一个文件,以这次的下载的版本,该文件是plexus-classworlds-2.5.2.jar,是一个类加载器框架
conf:这个目录用到的非常重要的文件setting.xml,直接修改该文件,就能在机器上全局地制定了Maven的行为
lib:该目录包含了所有Maven运行时需要的Java类库,Maven是分模块开发的,可以说lib目录就是真正的目录,还包含内置的超级POM(所有的POM均继承此文件,你可以使用解压工具打开jar文件$M2_HOME/lib/maven-model-builder-x.x.x.jar,然后访问路径org/apache/maven/model/pom-4.0.0.xml)
settings.xml文件配置
用户配置路径为${user.home}/.m2/settings.xml,该配置需用户自行创建
全局配置路径为${maven.conf}/settings.xml,该配置为maven自带配置,即原文所在位置
当两者都存在时,maven会合并这2个配置;有相同配置参数时,有效值为用户配置中的参数
localRepository
本地仓库路径,默认路径为${user.home}/.m2/repository
interactiveMode
互动模式,默认值为true。该值使用默认值即可,无需更改
offline
离线模式,默认值为false。当因为各种原因无法与远程仓库连接时,可将该值修改为true
pluginGroups
插件组,内部由n个pluginGroup节点组成,默认自带了org.apache.maven.plugins和org.codehaus.mojo。若有特殊的需求是可进行扩展。
proxies
代理设置,内部由n个proxy节点组成。部分公司出于安全考虑会需要员工通过代理才可上网,这时,就需配置该节点的参数了。
参数说明:
id:唯一标识符
active:是否被激活使用,默认为true。当有多个proxy节点存在时,用于选择使用哪个代理,但同一时间仅有一个代理会被被激活
protocol:协议类型
username:用户名,没有可不填
password:密码,没有可不填
host:IP地址
port:端口号
nonProxyHosts:不使用代理的地址
以上参数在通常配置代理的情况都会使用到,一样填上即可,最终的代理地址为protocol://host:port
servers
服务器,内部由n个server节点组成。有2种配置方式:一种是通过id匹配,username和password进行认证登录;另一种是通过id匹配指向一个privateKey(私钥)和一个passphrase
mirrors
镜像仓库,内部由n个mirror节点组成。用来代替中央仓库(Maven默认的远程仓库),用于提升传输速度。因此此处可以添加一个镜像,以提升我们下载的速度
profiles
用于覆盖在一个POM或者profiles.xml文件中的任何相同id的profiles节点
activeProfiles
activeProfile值为profile中所定义的id,在这里定义的activeProfile总是被激活
总结:
一般情况而言,settings.xml无需配置太多的东西,作为优化,可配置localRepository和mirrors
maven的简单使用
maven项目的目录约定
MavenProjectRoot(项目根目录)
|----src
| |----main
| | |----java ——存放项目的.java文件
| | |----resources ——存放项目资源文件,如spring配置文件
| |----test
| | |----java ——存放所有测试.java文件,如JUnit测试类
| | |----resources ——存放项目资源文件,如spring配置文件
|----target ——项目输出位置
|----pom.xml ----用于标识该项目是一个Maven项目
使用maven命令创建项目
mvn archetype:generate固定写法
-DgroupId 组织标识(包名)
-DartifactId 项目名称
-DarchetypeArtifactId 指定ArchetypeId,maven-archetype-quickstart,创建一个Java Project;
maven-archetype-webapp,创建一个Web Project
-DinteractiveMode 是否使用交互模式
例如:
mvn archetype:generate -DgroupId=com.qianbao.bhh -DartifactId=bhh-web -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false;
常用maven命令
mvn -v 查看maven的版本及配置信息
mvn compile 编译项目代码
mvn package 打包项目
mvn package -Dmaven.test.skip=true 打包项目时跳过单元测试
mvn test 运行单元测试
mvn clean 清除编译产生的target文件夹内容,可以配合相应命令一起使用,如mvn clean package, mvn clean test
mvn install 打包后将其安装在本地仓库
mvn deploy 打包后将其安装到pom文件中配置的远程仓库
mvn site 生成站点目录
mvn dependency:list 显示所有已经解析的所有依赖
mvn dependency:tree 以树的结构展示项目中的依赖
mvn dependency:analyze 对项目中的依赖进行分析,依赖未使用,使用但未引入
mvn -settings D:\nexus-settings.xml 制定settings配置文件
maven的核心概念
坐标
什么是坐标?
在平面几何中坐标(x,y)可以标识平面中唯一的一点。
maven坐标组成
- groupId:组织标识(包名)
- artifactId:项目名称
- version:项目的当前版本
- packaging:项目的打包方式,最为常见的jar、war、pom等
maven为什么使用坐标?
- Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范。
- 拥有了统一规范,就可以把查找工作交给机器。
依赖管理
依赖配置
依赖范围
依赖范围scope用来控制依赖和编译,测试,运行的classpath的关系**.** 主要的是三种依赖关系如下:
1.compile****: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
2.test:测试依赖范围。只对于测试classpath有效
3.provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
4.runtime:运行时提供。例如:jdbc驱动
传递性依赖
仓库管理
maven仓库
用来统一存储所有Maven共享构建的位置就是仓库
maven仓库布局
根据Maven坐标定义每个构建在仓库中唯一存储路径,大致为:groupId/artifactId/version/artifactId-version.packaging
仓库分类
本地仓库
每个用户只有一个本地仓库,默认是在/.m2/repository/,代表的是用户目录
远程仓库
中央仓库:Maven默认的远程仓库,URL地址:http://search.maven.org/
私服:是一种特殊的远程仓库,它是架设在局域网内的仓库
生命周期
何为生命周期?
maven生命周期就是为了对所有的构建过程进行抽象和统一,包括项目清理,初始化,编译,打包,测试,部署等几乎所有构建步骤
mven三大生命周期
maven有三套相互独立的生命周期,请注意这里说的是"三套",而且"相互独立",这三套生命周期分别是:
- Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
- Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
- Site Lifecycle 生成项目报告,站点,发布站点。
再次强调一下它们是相互独立的,你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。
Clean Lifecycle
clean生命周期每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行mvn clean ,这个的clean是Clean生命周期的一个阶段。有Clean生命周期,也有clean阶段。Clean生命周期一共包含了三个阶段:
- pre-clean 执行一些需要在clean之前完成的工作
- clean 移除所有上一次构建生成的文件
- post-clean 执行一些需要在clean之后立刻完成的工作
"mvn clean" 中的clean就是上面的clean,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,"mvn clean"等同于 mvn pre-clean clean ,如果我们运行 mvn post-clean ,那么 pre-clean,clean 都会被运行。这是Maven很重要的一个规则,可以大大简化命令行的输入。
Default Lifecycle
Default生命周期Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,只解释一些比较重要和常用的阶段:
- validate
- generate-sources
- process-sources
- generate-resources
- process-resources 复制并处理资源文件,至目标目录,准备打包。
- 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 。
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install 将包安装至本地仓库,以让其它项目依赖。
- deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。
运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行mvn install 的时候,代码会被编译,测试,打包。此外,Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要。
Site Lifecycle
Site生命周期pre-site 执行一些需要在生成站点文档之前完成的工作
- site 生成项目的站点文档
- post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy 将生成的站点文档部署到特定的服务器上
这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看。
聚合与继承
聚合
聚合是为了快速构建项目,如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合,例如:
继承
继承为了消除重复,我们把很多相同的配置提取出来,例如:grouptId,version等
继承配置代码
继承代码中定义属性
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<assertj-core.version>3.5.2</assertj-core.version>
<dropwizard-metrics.version>3.1.2</dropwizard-metrics.version>
<spring.version>4.3.4.RELEASE</spring.version>
<hibernate.version>5.2.4.Final</hibernate.version>
<hibernate-validator.version>5.2.4.Final</hibernate-validator.version>
<junit.version>4.12</junit.version>
父模块用dependencyManagement进行管理
子模块可以有选择行的继承,而不需要全部继承
私服nexus3安装及使用
安装
下载地址:http://www.sonatype.com/download-oss-sonatype
windows版本安装:
选择相应安装包下载,下载后解压得到如下:
- cmd执行nexus-3.12.1-01/bin/nexus /run
- 如果要安装为windows服务,执行nexus /install,提示服务安装成功后,启动执行net start nexus,停止执行net stop nexus。
- 安装完成后默认开放8081端口(nexus\nexus-3.12.1-01\etc\ nexus-default.properties中配置)
- 安装成功后有两个默认账号admin、anonymous,其中admin具有全部权限默认密码admin123;anonymous作为匿名用户,只具有查看权限。
Linux版本安装:
选择相应安装包下载,下载后解压得到如下:
cd bin下执行./nexus start
配置文件在etc/nexus-default.properties中,可修改端口,默认8081;用户admin,密码admin123
使用
Repositories说明
- maven-central:maven中央库,默认从https://repo1.maven.org/maven2/拉取jar
- maven-releases:私库发行版jar
- maven-snapshots:私库快照(调试版本)jar
- maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地maven基础配置settings.xml中使用。
本地maven库配置settings.xml
pom.xml配置
Maven多模块项目搭建
- 创建父模块demo
mvn archetype:generate -DgroupId=com.enterprise.demo -DartifactId=demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false;
- 进入父模块里,删除src文件夹,修改pom文件中
pom - 创建子模块demo-web
mvn archetype:generate -DgroupId=com.enterprise.demo -DartifactId=demo-web -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false;
- 创建子模块demo-core
mvn archetype:generate -DgroupId=com.enterprise.demo -DartifactId=demo-core -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false;
- 创建子模块demo-api
mvn archetype:generate -DgroupId=com.enterprise.demo -DartifactId=demo-api -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false;
- 创建子模块demo-admin
mvn archetype:generate -DgroupId=com.enterprise.demo -DartifactId=demo-admin -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false;
- 修改父pom文件,添加如下:
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
- 各模块依赖关系
web依赖core
core依赖api
admin依赖core
- 其他注意事项
各子模块pom中去掉groupid,可继承父模块