面试题
- 为什么使用maven–多模块构建,依赖管理系统,一致的项目结构,一致的构建模型和插件机制
- maven是什么–服务于java平台的自动化构建工具
- 构建有哪些环节–clean,compile,test,report,package,install,deploy
- 多模块如何聚合
- 常见的Maven私服的仓库类型–(宿主仓库)hosted repository, (代理仓库)proxy repository, (仓库组)group repository
- 如何查询一个插件有哪些目标–mvn help:describe -Dplugin=groupId:artifactId
- 对于一个多模块项目,如果管理项目依赖的版本?–1.使用import,2.使用dependencyManagement和pluginManagement
- 如何解决 jar 冲突–调整申明顺序,使用exclusions
- mvn clean package 命令执行了哪些动作–clean,resource,compile,testResource,testComplie,jar
安装
配置M2_HOME和path,执行mvn -v
概念
仓库(本地、远程[私有服务器,中央仓库],坐标[groupId:artifactId:packaging:version])
依赖
范围scope
- compile,缺省值,适用于所有阶段,会随着项目一起发布。
- provided,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
- runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段,跳过编译阶段。
- test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
- system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
-
import,用于一个
对另一个 的继承
PS:非compile范围的依赖是不能传递的。
原则
- 路径最短者优先原则
- 路径相同先声明优先原则
- 覆写优先
build配置
resources、plugins
生命周期
- Clean Lifecycle:在真正的构建之前进行项目的清理工作
- Default Lifecycle:构建的核心部分,包含编译、测试、打包、部署等。
- Site Lifecycle:生成项目报告,站点,发布站点。
Clean Lifecycle
- pre-clean:执行一些需要在 clean 之前完成的任务
- clean:移除所有上次构建所生成的文件
- post-clean:执行一些需要在 clean 之后完成的任务
Default Lifecycle
- process-resources 默认处理src/test/resources/下的文件,将其输出到测试的classpath目录中,
- compile 编译src/main/java下的java文件,产生对应的class,
- process-test-resources 默认处理src/test/resources/下的文件,将其输出到测试的classpath目录中,
- test-compile 编译src/test/java下的java文件,产生对应的class,
- test 运行测试用例,
- package 打包构件,即生成对应的jar, war等,
- install将构件部署到本地仓库,
- deploy 部署构件到远程仓库
Site Lifecycle
- pre-site:执行了一些需要在生成报告站点之前完成的工作
- site:生成项目的站点文档
- post-site:执行一些需要在生成报告站点之后完成的任务
- site-deploy:将生成的站点文档部署到远程服务器
与ant的区别
- Ant 没有正式的约定一个项目的目录结构,你必须明确的告诉Ant哪里放源码,哪里放字节码等。
- Ant 是程序化的,你必须告诉 Ant 做什么,什么时候做。
- Ant 没有生命周期,你必须定义目标和目标之间的依赖。
打包后的运行
java -cp target/demo-1.0-SNAPSHOT.jar com.acey.demo.App
概念
- 一个 Maven 插件(plugin)是一个或多个目标(goal)的集合
聚合
将多个项目同时运行就称为聚合。
<modules>
<module>../模块1</module>
<module>../模块2</module>
<module>../模块3</module>
</modules>
继承
在聚合多个项目时,如果这些被聚合的项目中需要引入相同的Jar,那么可以将这些Jar写入父pom中,各个子项目继承该pom即可。
父项目
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.2.2</version>
</dependency>
</dependencies>
</dependencyManagement>
子项目
<parent>
<groupId>父pom所在项目的groupId</groupId>
<artifactId>父pom所在项目的artifactId</artifactId>
<version>父pom所在项目的版本号</version>
</parent>