maven学习笔记

面试题

  • 为什么使用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范围的依赖是不能传递的。

原则

  1. 路径最短者优先原则
  2. 路径相同先声明优先原则
  3. 覆写优先

build配置

resources、plugins

生命周期

  • Clean Lifecycle:在真正的构建之前进行项目的清理工作
  • Default Lifecycle:构建的核心部分,包含编译、测试、打包、部署等。
  • Site Lifecycle:生成项目报告,站点,发布站点。

Clean Lifecycle

  • pre-clean:执行一些需要在 clean 之前完成的任务
  • clean:移除所有上次构建所生成的文件
  • post-clean:执行一些需要在 clean 之后完成的任务

Default Lifecycle

  1. process-resources 默认处理src/test/resources/下的文件,将其输出到测试的classpath目录中,
  2. compile 编译src/main/java下的java文件,产生对应的class,
  3. process-test-resources 默认处理src/test/resources/下的文件,将其输出到测试的classpath目录中,
  4. test-compile 编译src/test/java下的java文件,产生对应的class,
  5. test 运行测试用例,
  6. package 打包构件,即生成对应的jar, war等,
  7. install将构件部署到本地仓库,
  8. 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>
Author: bkdwei