跳至主要內容

Maven 基本概念

Steven大约 3 分钟maven

Maven 是一个自动化的构建工具,主要用于 Java 项目。

Maven 的主要目标是让开发人员能够在最短时间内完成开发工作的完整状态:

  • 简化构建过程
  • 统一构建环境
  • 整合构建信息
  • 易扩展

Maven 构建生命周期

Maven 将一个整体的构建任务划分为了多个的阶段。每个阶段的具体工作由一个个对应的 Maven 插件执行。

构建阶段分三个周期:

  1. clean —— 清理项目构建结果
    • pre-clean
    • clean
    • post-clean
  2. default/build —— 部署项目的构建处理
    • 构建
      • validate
      • initialize
      • 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 mvn test
    • 打包
      • prepare-package
      • package mvn package
      • pre-integration-test
      • integration-test
      • post-integration-test mvn integration-test
      • verify
      • install
      • deploy mvn deploy
  3. site —— 生成项目站点的文档
    • pre-site
    • site
    • post-site mvn site
    • site-deploy

提示

Maven 生命周期由 maven-core 模块的 components.xml 文件定义

依赖

作用域 scope

作用域定义依赖的存在时期

作用域(Scope)编译(Compile)测试(Test)运行(Run)打包(Package)示例
compile(默认)spring
providedlombok
testjunit
runtimetomcat、JDBCDriver
systemasm

依赖管理

todo 优先级、版本范围指定、版本固定之类的东西

使用 dependencyManagement 管理依赖版本。 在 dependencyManagement 中申明的 dependencies 不会被实际下载 jar 包,只有当该 jar 包被实际依赖后,才会去下载对应的 jar 包版本。

<!-- 只是对版本进行管理,不会实际引入jar -->
<dependencyManagement>  
      <dependencies>  
            <dependency>  
                <groupId>org.springframework</groupId>  
                <artifactId>spring-core</artifactId>  
                <version>3.2.7</version>  
            </dependency>  
    </dependencies>  
</dependencyManagement>  
  
<!-- 会实际下载jar包 -->
<dependencies>  
       <dependency>  
                <groupId>org.springframework</groupId>  
                <artifactId>spring-core</artifactId>  
       </dependency>  
</dependencies>  

排包(技巧)

execution 标签排包会不彻底: 在 dependency 中用 execution 标签排包可能会在其他 dependency 中再次引入该包。

方案一:阿里的方式:维护并引入空依赖

问题:1、工作量;2、私服搭建

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.0-Empty</version>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
  </dependencies>
</project>

方案二:用 provided 引入

问题:运行期比编译期少一个依赖,运行时可能出现 ClassNotFoundException 问题

<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
  <scope>provided</scope> <!-- 设置为运行时应该提供,所以编译时不主动下载 -->
</dependency>

方案三:用 test 引入

问题: 可能静态检查工具出现误报

<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
  <scope>test</scope>
</dependency>

Maven 仓库

Maven 仓库是用来存放项目中依赖的软件包(jar、war、pom)和元素据(坐标信息、源码、作者、SCM、许可证)等信息

Maven 仓库有三种类型:

  • 本地(Local) —— 本地缓存
  • 远程(Remote) —— 企业级内部构建的仓库,主要是为了统一管理和加快下载速度
  • 中央(Central) —— 开源仓库

优先级: 本地 > 远程 > 中央

仓库配置:

一般在 .m2/repository/settings.xml 上配置远程仓库,也可以在 pom.xml 上配置。 优先级: pom.xml > user settings > global settings

mvn -X # 查看 settings.xml 文件的读取顺序
mvn help:effective-settings # 查看当前生效的 settings.xml

参考: