Maven到底是个啥?——Maven深入理解

一、maven

1.maven简介

  • Apache Maven是一个软件项目管理和综合工具。基于项目对象模型(POM)的概念,Maven可以从一个中心资料片管理项目构建,报告和文件。

  • 简单理解为统一管理jar包的仓库。

  • maven项目采用“约定优于配置”的原则,src/main/java约定用于存放源代码,src/main/test用于存放单元测试代码,src/target用于存放编译、打包后的输出文件。

2.Maven版本管理

  • maven中的仓库分为两种,snapshot快照仓库和release发布仓库。snapshot快照仓库用于保存开发过程中的不稳定版本,release正式仓库则是用来保存稳定的发行版本。
  • 如果是快照版本,那么在mvn deploy时会自动发布到快照版本库中,会覆盖老的快照版本,而在使用快照版本的模块,在不更改版本号的情况下,直接编译打包时,maven会自动从镜像服务器上下载最新的快照版本。
  • 如果是正式发布版本,那么在mvn deploy时会自动发布到正式版本库中,而使用正式版本的模块,在不更改版本号的情况下,编译打包时如果本地已经存在该版本的模块则不会主动去镜像服务器上下载。

3.Maven生命周期

生命周期(lifecycle)可以理解成由各种plugin按照一定的顺序执行来完成java项目清理、编译、打包、测试、布署等整个项目的流程的一个过程。各个插件的执行顺序一般是:1.clean、2.resources、3.compile、4.testResources、5.testCompile、6.test、7.jar、8.install。

  • clean阶段是独立的一个阶段,功能就是清除工程目前下的target目录,对应的插件是 maven-clean-plugin。

  • resource插件maven-resources-plugin,功能就是把项目需要的配置文件拷贝到指定的目录,默认是拷贝src\main\resources目录下的件到classes目录下,当然可以自己来配置源目录和输出目录。

  • compile插件maven-compiler-plugin,执行时先调用resouces插件,功能就是把src\mainjava源码编译成字节码生成class文件,并把编译好的class文件输出到target\classes目录下。

  • 单元测试所用的compile和resources插件和主代码是相同的,但执行的目标不一样,testCompile和testResources是把src\test\java下的代码编译成字节码输出到target\test-classes,同时把src\test\resources下的配置文件拷贝到target\test-classes。

  • package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库。mvn clean package依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7个阶段。

  • install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库。mvn clean install依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install等8个阶段。

  • deploy命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库。mvn clean deploy依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install、deploy等9个阶段。

二、Maven核心概念

1.工程目录

Maven到底是个啥?——Maven深入理解_第1张图片

Java开发领域普遍认同的一个观点:约定>配置>编码(能用配置解决的问题就不编码,能基于约定的就不配置)

2.POM

Project Object Model:项目对象模型。将 Java 工程的相关信息封装为对象作为便于操作和管理的模型。

这是Maven 工程的核心配置。需要注意的是,这里指的工程对应的是idea中的module而不是指project。

3.坐标

  • Maven 的坐标 使用如下三个向量在 Maven 的仓库中唯一的确定一个 Maven 工程。

    • groupid:公司或组织的域名倒序+当前项目名称
    • artifactId:当前项目的模块名称
    • version:当前模块的版本
      <groupId>net.xsj.maven</groupId>
      <artifactId>Hello</artifactId>
      <version>1.0.0-SNAPSHOT</version>
    
  • 以连起来的字符串作为目录结构到仓库中查找

net/xsj/maven/Hello/1.0.0-SNAPSHOT/Hello-1.0.0-SNAPSHOT.jar
  
  // 注意:我们自己的 Maven 工程必须执行安装操作才会进入仓库。安装的命令是:mvn install

4.依赖

  • 依赖的使用:使用 标签指定被依赖 jar 包的坐标
  • 依赖的范围:有时依赖信息中除了目标 jar 包的坐标还有一个 scope 设置,使用标签,这就是依赖的范围。依赖的范围有几个可选值,常用的有:compile、test、provided 三个,当然还有不常用的 runtime、system…
    • compile:默认范围,编译测试运行都有效
    • provided:在编译和测试时有效
    • runtime:在测试和运行时有效
    • test:只在测试时有效
    • system:在编译和测试时有效,与本机系统关联,可移植性差
  • 依赖的传递性:A 依赖 B,B 依赖 C,A 能否使用 C 呢?那要看 B 依赖 C 的范围是不是 compile,如果是则可用,否则不可用。
  • 依赖的排出:如果我们在当前工程中引入了一个依赖是 A,而 A 又依赖了 B,那么 Maven 会自动将 A 依赖的 B 引入当 前工程,但是个别情况下 B 有可能是一个不稳定版,或对当前工程有不良影响。这时我们可以在引入 A 的时候将 B 排除。使用的标签是
    <exclusions>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
    </exclusions>
  • 统一管理所依赖 jar 包的版本,对同一个框架的一组 jar 包最好使用相同的版本。为了方便升级框架,可以将 jar 包的版本信息统一提取出来

    // 统一声明版本号
    <properties>    
        <starfish.spring.version>4.1.1.RELEASE</starfish.spring.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    // 引用前面声明的版本号
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${starfish.spring.version}</version>
        <scope>compile</scope>
    </dependency>
    

5.仓库

  • 分类
    • 本地仓库:为当前本机电脑上的所有 Maven 工程服务
    • 远程仓库
      • 私服:在当前局域网环境下
      • 中央仓库:架设在 Internet 上,为全世界所有 Maven 工程服务
      • 中央仓库镜像:架设在各个大洲,为中央仓库分担流量。减轻中央仓库的压力,同时更快的响应用户请求。
  • 仓库中的文件
    • Maven 的插件
    • 我们自己开发的项目的模块
    • 第三方框架或工具的 jar 包

6.生命周期

  • Maven 生命周期定义了各个构建环节的执行顺序,有了这个清单,Maven 就可以自动化的执行构建命令了。

  • Maven 有三套相互独立的生命周期,分别是:

    • Clean Lifecycle 在进行真正的构建之前进行一些清理工作
    • Default Lifecycle 构建的核心部分,编译,测试,打包,安装,部署等等
    • Site Lifecycle 生成项目报告,站点,发布站点
  • maven的生命周期是相互独立的,你可以仅仅调用 clean 来清理工作目录,仅仅调用 site 来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。 每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。

  • 运行任何一个阶段的时候,它前面的所有阶段都会被运行,例如我们运行 mvn install 的时候,代码会被编译,测试,打包。这就是 Maven 为什么能够自动执行构建过程的各个环节的原因。此外,Maven 的插件机制是完全依赖 Maven 的生命周期的。

Maven常用命令

1.maven 命令参数

# 离线模式,相当于以本地模式执行
mvn -o | mvn clean install -o
# 禁用递归查找 pom.xml,多 module 工程中可以用来单独 install 'parent'
mvn -N | mvn clean install -N
# 禁用交互模式(听说在 jenkins 上可以禁止输出下载进度?)
mvn -B | mvn clean install -B
# 多 module 工程中指定打包某个 module 和其依赖的 module,若指定多个以逗号分隔
mvn -pl xxx -am | mvn clean package -pl xxx-api -am
# 多 module 工程中指定从某个 module 开始构建,可以和 -pl 联用
mvn -rf | mvn clean package -rf xxx-api
# 异常时打印堆栈
mvn -e
# 开启 debug 模式,打开后日志茫茫多,包括 -e 的内容
mvn -X
# 开启多线程构建,'C' 代表 cpu 核数,'0.5C' 表示有 core/2 个线程,'4' 表示固定 4 个线程
mvn -T 0.5C | mvn -T 4
# 指定 pom.xml 文件路径
mvn -f
# 指定 settings.xml 文件路径
mvn -s
# 强制更新依赖
mvn -U
# 强制更新插件
mvn -up
# 禁止更新依赖
mvn -nsu
# 禁止更新插件
mvn -npu
# 激活 profile
mvn -P
# 开启静默模式,只输出异常,某些场景下非常有用
mvn -q | mvn help:evaluate -q -DforceStdout -Dexpression=project.version

2.maven 常用命令

# 打包并拷贝依赖的 jar 包到 target/dependency 下
mvn clean package dependency:copy-dependencies -DincludeScope=compile -DskipTests=true -Dmaven.source.skip=true
# 查看当前激活的 profiles
mvn help:active-profiles
# 获取 pom.xml 中某个变量的值
mvn help:evaluate -q -DforceStdout -Dexpression=project.version
# 排查 jenkins 问题
mvn -B -U -V -s /media/disk1/fordata/jenkins/tools/maven/conf/settings.xml clean help:active-profiles help:effective-settings help:system -DshowPasswords=true
# release
release:clean release:prepare release:perform -B -N -Darguments="-B -U"
# 生成模块化工程
mvn archetype:generate -DarchetypeGroupId=kuaishou -DarchetypeArtifactId=java-archetype -DarchetypeVersion=1.0-SNAPSHOT -DarchetypeCatalog=local -DgroupId=com.kuaishou.examples -DartifactId=kuaishou-java-code-examples -Dversion=1.0.0-SNAPSHOT -Dpackage=com.kuaishou.examples
# 查看 maven 插件的文档
mvn help:describe -Dplugin=war -Dfull=true -Dversion=3.0.0

你可能感兴趣的:(SpringBoot,Maven,java)