菜鸟Maven
Maven主要帮助开发者完成依赖、构建、发布等工作,声名文件是项目或各模块内的pom.xml。
Maven安装
- 下载并解压
- 配置环境变量
- 配置远程仓库镜像及本地仓库目录:
${M2_HOME}/conf/settings.xml
生命周期
Maven有三个标准的生命周期:
- clean
- default(build)
- site
不同的生命周期又抽象出了各阶段(phase):每个阶段都成为了一个扩展点,可以采用不同的方式来实现,提高了扩展性与灵活性;同时规范了Maven的执行路径。
Maven插件
生命周期中各阶段(phase)的实际操作由Maven插件执行,Maven的核心部分代码量很少,大部分实现都是由插件来完成。
在pom.xml中,可以设置指定插件目标(goal)与阶段(phase)绑定,当项目构建到给定阶段时,就会触发绑定插件的goal的执行,如官网演示的插件执行器。
另外,插件也可以通过mvn plugin-name:goal
直接运行。
插件与生命周期的关系是:
- 生命周期的阶段可以绑定到具体的插件及目标
- 不同配置下,同一个阶段可以对应多个插件和目标(如打jar包和打war包时)
- Maven默认为不同的阶段绑定了插件实现,参见说明和实现(
%M2_HOME%/lib/maven-core.xxx.jar/MATE-INF/plexus/default-bindings.xml
)
如何自定义Maven插件参见这里
Maven项目结构
即约定大于配置:
----(${basedir})
|
pom.xml
|
/src/main/java/
/src/main/resources/
/src/main/webapp/WEB-INF/
/src/test/java/
/src/test/resources/
/target/classes/
/target/test-test-classes/
常用命令
- mvn clean
- mvn compile
- mvn package
- mvn test
- mvn archetype:generate
...
依赖
依赖传播:只需要在项目的pom中定义好直接的依赖关系,间接依赖maven会帮我们搞定;
-
依赖优先原则
- 最短路径
- 相同路径配置在前的优先
- 同一个pom文件,同一个依赖的不同版本,配置在后的生效
依赖可选:父项目P不允许子项目C依赖其可选依赖
依赖排除:子项目C不依赖父项目P的目标依赖
依赖管理:在rootpom.xml声明所有依赖(使用dependencyManagement与否皆可),所有继承其的子项目不用再指定依赖版本。
-
依赖范围:范围指的是编译、测试、运行三个阶段,声明依赖时指定不同的范围(通过
标签),maven会在不同的阶段将其引入classpath。详情参考这篇博客- compile:默认的依赖范围,编译、测试运行三个阶段都会被引入classpath
- test:只有在测试阶段会被引入,代码编译和项目运行时不会被引入,如jUnit
- provided:只有在编译和测试时候会被引入,项目运行时不会被引入,如setvlet-api
- runtime:只有在测试和运行阶段会被引入,编译阶段不会被引入,如JDBC驱动,编译时只提供接口
- system:非Maven仓库中的jar,与provided一致,但需通过systemPath来指定依赖文件的路径
- import:与dependencyManagement元素配合使用
聚合
指将多个模块整合在一起,统一构建。需要一个父工程,使用
配置其中对应的子工程的相对路径。
继承
子工程通过
继承父工程,则可以继承其:
- 属性:通过
标签配置,引用方式是${属性名称}
,maven的默认属性有${basedir}、${version}
等 - 依赖
- 插件
上面的三个配置子工程够可以重写,重写之后以子工程为准。
Maven仓库
Maven仓库分为:
- 本地仓库(Maven所需的构件都是直接从本地仓库获取的,若本地仓库没有,会从远程仓库下载至本地仓库后再使用。默认位置是
%USER_HOME%/.m2/repository
,在%M2_HOME%/conf/setting.xml
配置文件中可修改) - 中央仓库(Maven 社区提供的仓库)
- 远程仓库(中央仓库、阿里镜像、企业私服等)
Maven项目中可以修改仓库位置共有一下几处:
- 中央仓库,默认的仓库
- 镜像仓库,settings.xml中的settings.mirrors.mirror
- 全局profile仓库,settings.xml中的settings.profiles.profile.repositories.repository
- 项目仓库,pom.xml中的project.repositories.repository
- 项目profile仓库,pom.xml中的project.profiles.profile.repositories.repository
- 本地仓库
若所有配置都存在,依赖的搜索顺序就会变得异常复杂,详见这里介绍。结论如下:
- 只要本地仓库中包含依赖,无论怎么配置,都会优先使用local本地仓库中的jar
- local_repo>settings_profile_repo>pom_profile_repo>pom_repositories>settings_mirror>central
Maven Profiles
Maven构建配置文件用于修改构建过程,可以被多种方式激活。
settings.xml中提供的配置文件旨在提供本地计算机特定的路径和存储库位置,以允许构建在本地环境中工作。对于settings.xml中定义的配置文件,您只能指定仓库位置,插件仓库位置和自由格式属性,以用作POM中插件的配置变量。
pom.xml中也可以指定profiles和activeProfiles来进行差异化构建。
Nexus私服的搭建
私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件,参见这里。
下载
下载地址点我,一种是包含jetty容器的bundle包,另一种是不包含容器的war包,按需下载即可。
安装
-
Windows安装见这里(3.0以下版本)
- 3.0及以上版本免安装、免配置,见这里
- 在cmd中从C盘到D盘不使用cd命令符,直接输入
D:
即可。
-
Linux安装方式如下,yum安装点我:
- 解压
tar -zxvf nexus-2.14.5-02-bundle.tar.gz
- 在环境变量中设置启动用户
vim /etc/profile
,不建议使用root用户,如果使用其他用户需要增加相应权限export RUN_AS_USER=root
- 配置启动参数
vim ${nexusBase}/conf/nexus.properties
,默认端口8081 - 启动与停止
${nexusBase}/bin/nexus start/stop
,若注册为服务 - 登录页面
http://{ip}:port/nexus
,用户名admin,密码admin123
- 解压
仓库说明
- 3rd party:第三方仓库
- Apache Snapshots:Apache快照仓库
- Central :Maven中央仓库,一般要修改该仓库的Remote Storage Location的值为国内镜像地址
- Releases:私有发布版本仓库
- Snapshots:私有快照版本仓库
指向私服
- pom.xml中的project.repositories.repository
- settings.xml中的settings.mirrors.mirror
若指向私服后,依赖无法找到,可能是因为这个原因
发布项目至私服
- pom.xml中使用
进行配置 - settings.xml中配置
认证信息
详情参见这里。