Maven 入门手册?拿去吧你~

1,980 阅读7分钟

1. Maven 简介

1)项目构建

完成工程发布流程需要的一系列步骤,包括:编译、测试、打包、部署...

2)传统项目管理状态分析

  • jar 包不统一,jar 包不兼容
  • 工程升级维护过程操作繁琐
  • ...

3)项目构建工具

  • 传统构建工具 Ant:需编写 build.xml 文件来配置任务流程
  • 新兴构建工具 Gradle:以 Android 为典型,基本现在所有 Android 项目都采用 Gradle 作项目构建工具;配置写在 build.gradle 文件中
  • 主流构建工具 Maven:基于约定优于配置原则(约定的一些规范无需再配置)的项目构建工具。遵循约定虽然损失了一定的灵活性,用户不能随意安排目录结构,但是却能减少配置。更重要的是,遵循约定能够帮助用户遵守构建标准。

4)约定优于配置

如果没有约定,10 个项目可能使用 10 种不同的项目目录结构,这意味着交流学习成本的增加,当新成员加入项目的时候,他就不得不花时间去学习这种构建配置。而有了 Maven 的约定,大家都知道什么目录放什么内容。

也许这时候你会问,如果我不想遵守约定该怎么办?这时,请首先问自己三遍,你真的需要这么做吗?如果仅仅是因为喜好,就不要耍个性,个性往往意味着牺牲通用性,意味着增加无谓的复杂度。

1.1 Maven 定义

  • Maven 的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM
  • POM(Project Object Model):项目对象模型

1.2 Maven 作用

  • 项目构建:提供标准的、跨平台的自动化项目构建方式
  • 依赖管理:方便快捷地管理项目依赖的资源(jar 包),避免资源间的版本冲突问题
  • 统一开发结构:提供标准的、统一的项目结构

例:一个由 Maven 构建的 Java 工程目录结构默认如下:

pom.xml:项目描述文件

src/main/resources:存放 Java 源码的目录

src/main/resources:存放资源文件的目录

src/test/java:存放测试源码的目录

src/test/resources:存放测试资源的目录

target:存放所有编译、打包生成的文件

注意:所有的目录结构都是约定好的标准结构,我们千万不要随意修改目录结构。

2. Maven 下载与安装

官网:maven.apache.org/

下载地址:maven.apache.org/download.cg…


Maven 属于绿色版软件(解压即安装

Maven 环境变量配置:

  • 依赖 Java,需要配置 JAVA_HOME
  • 设置 Maven 自身的运行环境,需要配置 MAVEN_HOME
    • 1)新建 MAVEN_HOME
    • 2)在 Path 变量中添加 %MAVEN_HOME%\bin
  • 测试环境配置结果

3. Maven 基础概念与配置

3.1 仓库

  • 仓库作用:存储资源,包含各种 jar 包
  • 仓库分类
    • 本地仓库:自己电脑上存储资源的仓库,连接远程仓库获取资源
    • 远程仓库:非本机电脑上的仓库,为本地仓库提供资源
      • 中央仓库:Maven 开发团队维护,存储所有资源的仓库
      • 私服:部门/公司范围内存储资源的仓库,从中央仓库获取资源
  • 私服的作用
    • 保存具有版权的资源,包含购买或自主研发的 jar 包
      • 中央仓库中的 jar 都是开源的,不能存储具有版权的资源
    • 一定范围内共享资源,仅对内部开放,不对外共享

3.2 坐标

1)什么是坐标?

Maven 中的坐标用于描述仓库中资源的位置

maven.org 中央仓库:repo1.maven.org/maven2/

2)Maven 坐标主要组成

groupId:定义当前 Maven 项目隶属组织名称(通常是域名反写,例如:org.mybatis

artifactId:定义当前 Maven 项目名称(通常是模块名称,例如:CRM、SMS)

version:定义当前项目版本号

packaging:定义该项目的打包方式

3)Maven 坐标的作用

使用唯一标识,唯一性定义资源位置,通过该标识可以将资源的识别与下载工作交由机器完成

3.3 本地仓库配置

Maven 启动后,会自动保存下载的资源到本地仓库,如下将自定义本地仓库位置:

3.4 远程仓库配置

Maven 默认连接的 Central Repository 位置(pom-4.0.0.xml 文件中)

3.5 镜像仓库配置

在 setting.xml 文件中配阿里云镜像仓库,当我们需要访问中央仓库时,直接访问国内的镜像仓库,提升了访问速度。

<mirrors>
    <!-- mirror
     | Specifies a repository mirror site to use instead of a given repository. The repository that
     | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
     | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
     |
        <mirror>
          <id>mirrorId</id>
          <mirrorOf>repositoryId</mirrorOf>
          <name>Human Readable Name for this Mirror.</name>
          <url>http://my.repository.com/repo/path</url>
        </mirror>
     -->

    <!-- 配置具体的仓库的下载镜像 -->
    <mirror>
        <!--此镜像的唯一标识符,用来区分不同的 mirror 元素-->
        <id>nexus-aliyun</id>
        <!--对哪种仓库进行镜像,简单说就是代替哪个仓库-->
        <mirrorOf>central</mirrorOf>
        <!--镜像名称-->
        <name>Nexus aliyun</name>
        <!--镜像URL-->
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
</mirrors>

4. Maven 项目构建命令

Maven 构建命令使用 mvn 开头,后面添加功能参数,可以一次执行多个命令,使用空格分隔

命令含义
mvn compile编译
mvn clean清理
mvn test测试
mvn package打包
mvn install安装到本地仓库

5. 插件创建工程

  • 创建工程
mvn archetype:generate
	-DgroupId={project-packaging}
	-DartifactId={project-name}
	-DarchetypeArtifactId=maven-archetype-quickstart
	-DinteractiveMode=false
  • 创建 Java 工程
mvn archetype:generate
	-DgroupId=com.one
	-DartifactId=JavaProject
	-DarchetypeArtifactId=maven-archetype-quickstart
	-Dversion=0.0.1-snapshot
	-DinteractiveMode=false

  • 创建 Web 工程
mvn archetype:generate
	-DgroupId=com.one
	-DartifactId=WebProject
	-DarchetypeArtifactId=maven-archetype-webapp
	-Dversion=0.0.1-snapshot
	-DinteractiveMode=false

6. IDEA 生成 Maven 项目

IDEA 对 3.6.2 及以上版本存在兼容性问题,为避免冲突,IDEA 中安装使用 3.6.1 版本。

6.1 配置 Maven

6.2 原型创建 Java 项目

6.3 原型创建 Web 项目

6.4 插件

配置 Tomcat7 运行插件(Plugin):

<!-- 构建 -->
<build>
    <!-- 设置插件 -->
    <plugins>
        <!--具体插件-->
        <plugin>
            <!-- 地址: https://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat7-maven-plugin -->
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.1</version>
            <!-- 自定义配置端口、项目访问路径... -->
            <configuration>
                <port>80</port>
                <path>/web_App</path>
            </configuration>
        </plugin>
    </plugins>
</build>

7. 依赖管理

7.1 依赖配置

  • 依赖指当前项目运行所需的 jar 包,一个项目可以设置多个依赖
  • 格式:
<!--设置当前项目所依赖的所有jar包-->
<dependencies> 
    <!--设置具体依赖--> 
    <dependency> 
        <!--依赖所属群组id--> 
        <groupId>junit</groupId> 
        <!--依赖所属项目id--> 
        <artifactId>junit</artifactId> 
        <!--依赖版本号--> 
        <version>4.12</version>
	</dependency>
</dependencies>

7.2 依赖传递

  • 依赖具有传递性
    • 直接依赖:在当前项目中通过依赖配置建立的依赖关系
    • 间接依赖:当前项目的依赖资源如果依赖其他资源,则称当前项目间接依赖其他资源

7.3 依赖传递冲突问题

  • 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
  • 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
  • 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的

7.4 可选依赖

可选依赖指对外隐藏当前所依赖的资源——透明不可视

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <!--可选依赖:true-->
    <!-- 被引用资源-配置 -->
    <optional>true</optional>
    <version>4.12</version>
</dependency>

7.5 排除依赖

排除依赖指主动断开依赖的资源,被排除的资源无需指定版本——不需要

<dependency>
    <groupId>com.one</groupId>
    <artifactId>project02</artifactId>
    <version>1.0-SNAPSHOT</version>
    <scope>provided</scope>
    <!-- 引用资源-配置 -->
    <!-- 排除依赖:主动断开依赖的资源 -->
    <exclusions>
        <!-- 被排除的资源无需指定版本!因为排除所有版本! -->
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>

7.6 依赖范围

  • 依赖的 jar 默认情况可以在任何地方使用,可以通过 scope 标签设定其作用范围
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.2</version>
    <!-- 作用范围:runtime;仅参与打包-->
    <scope>runtime</scope>
</dependency>
  • 作用范围
    • 主程序范围有效(main 文件夹范围内)
    • 测试程序范围有效(test 文件夹范围内)
    • 是否参与打包(package 指令范围内)

7.7 依赖范围传递性

带有依赖范围的资源在进行传递时,作用范围将受到影响

8. Maven 生命周期与插件

8.1 项目构建生命周期

Maven 构建生命周期就是 Maven 将一个整体任务划分为一个个的阶段,类似于流程图,按顺序依次执行。也可以指定该任务执行到中间的某个阶段结束。

img

Maven 对项目构建的生命周期划分为 3 套:

  • clean:清理工作
  • default:核心工作,例如:编译,测试,打包,部署等
  • site:产生报告,发布站点等

注意:当执行到某一阶段,此前所有的工作都会完成。

8.2 插件

  • 插件与生命周期内的各阶段绑定,在执行到对应生命周期时执行对应的插件功能
  • 默认 maven 在各个生命周期上绑定有预设的功能
  • 通过插件可以自定义其他功能
 <build>
     <plugins>
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-source-plugin</artifactId>
             <version>3.2.0</version>
             <executions>
                 <!--执行-->
                 <execution>
                     <!-- 配置对应的执行位置! -->
                     <goals>
                         <!--对源码进行打包!-->
                         <goal>jar</goal>
                         <!--同时对测试源码打包!-->
                         <goal>test-jar</goal>
                     </goals>
                     <!--执行到 generate-test-resources 阶段或此后阶段都会运行此插件!-->
                     <phase>generate-test-resources</phase>
                 </execution>
             </executions>
         </plugin>
     </plugins>
</build>

例如 source-plugin

更多插件及其用法详见maven.apache.org/plugins/ind…


Maven 进阶文章即将上线,敬请期待...

下文Maven 进阶之旅

原创不易🧠 转载请标明出处🌊

若本文对你有所帮助,点赞支持嗷🔥