Maven 基础及 IDEA 创建 Maven 项目范例

Maven 基础及 IDEA 创建 Maven 项目范例


Maven 是一款用 Java 语言编写的软件开发项目管理工具

Maven 的两个核心功能:

  • 依赖管理
    • 传统做法,我们必须将工程所依赖的 jar 包复制到工程的依赖库目录,或公共的依赖库目录,缺点明显:
      1. 若每个工程使用各自的依赖库,会重复占用存储空间
      2. 若使用一个公共依赖库
        • 每个工程都会引入大量用不到的依赖
        • 常发生版本冲突
      3. 使用、维护依赖库的操作繁琐
    • Maven 可以帮用户进行依赖管理,通过在 pom.xml 配置文件中添加所需 jar 包的 “坐标” ,即可为工程引入依赖
      • 工程通过配置文件,引入本地依赖库中的指定 jar 包
      • 本地没有的包,通过网络从 MavenRepository 库中下载
  • 项目构建
    • 项目从编译、测试、打包、安装,部署整个过程都可以由 maven 进行处理。


  • 下载

  • 安装

    1. 依赖,Maven 使用 JAVA 语言,依赖 JAVA 运行环境(需要配置好 JAVA_HOME 环境变量)

    2. 解压

      • 目录说明
        • bin:可执行程序(命令、脚本)
        • boot:存放了一些 Maven 本身的引导程序,如类加载器等
        • conf:配置文件,比如:setting.xml
        • lib:Maven 本身运行所需要的 jar 包
    3. 配置 Maven 自身的环境变量

      • 添加:MAVEN_HOME ( bin 文件夹所在目录,非 bin 目录 )
      • path 中添加:%MAVEN_HOME%\bin
      • 验证:mvn --version
    4. 配置本地仓

      • 编辑 conf/setting.xml 文件,添加(准备一个专门用来放本地依赖库的文件夹)

        • 1
          
          <localRepository>D:\#Coding\_Environment\Maven_Repository</localRepository>
          
    5. 配置第三方镜像仓

      • 默认的官方 Maven Repository 中央仓在:https://repo1.maven.org/maven2/

      • 由于网络原因,建议配置国内的第三方镜像仓,比如:阿里

      • 编辑 conf/setting.xml 文件,在 <mirrors> </mirrors> 中添加

        • 1
          2
          3
          4
          5
          6
          
          <mirror>
              <id>alimaven</id>
              <name>aliyun maven</name>
              <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
              <mirrorOf>central</mirrorOf>
          </mirror>
          
      • 参考

      • (如有必要,还可以自建内网镜像仓)


由于 IDEA 还内置了一个 Maven(bunbled),但直接使用这个内置 Maven 存在一些问题。我们需要修改设置,指定为已经配置好的 Maven :

直接修改 “Settings for New Projects” ,对以后创建的工程全部生效

0729a.png
Maven 基础(1.Settings for New Projects)

要修改的地方有 3 项

因为前面已经在配置文件中配置好了本地依赖库,配置好前两项之后,第 3 项就会自动切换过来

0729b.png
Maven 基础(2.修改 IDEA 的 Maven 配置)

0729c.png
Maven 基础(3.创建 Maven 项目)
0729d.png
Maven 基础(4.项目名、路径……)

指定 JDK 版本和字符编码方式

1
2
3
4
5
6
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
</properties>

指定打包类型(如果不是 Web 项目,可免此步骤,缺省就是 jar 方式打包)

1
<packaging>war</packaging>

比如,为项目添加 Mybatis 的依赖

通过 Maven 进行依赖管理,可以免去手动寻找、下载、引入 jar 包的繁琐过程

  1. Maven 官方依赖库 网站上检索该包的引入代码(坐标)

  2. 将该坐标添加到 pom.xml 的 <dependencies> </dependencies> 标签中

    •  1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      
      <dependencies>
      
              <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
              <dependency>
                  <groupId>org.mybatis</groupId>
                  <artifactId>mybatis</artifactId>
                  <version>3.5.6</version>
              </dependency>
      
      </dependencies>
      
  3. 侦测到添加了新的依赖后,IDEA 会在右上角弹出一个重新加载 Maven 的小按钮

    • 0729e.png
      Maven 基础(5.添加依赖一)
    • 如果本地依赖库中从来没下载过该依赖的任意版本,会显示为红字
  4. 点击该按钮后,Maven 会自动从网络下载该依赖包到本地库

    • 0729f.png
      Maven 基础(6.添加依赖二)
  5. 下载完成后,就可以使用了


maven 对项目构建过程分为 “三套相互独立的” 生命周期,分别是:

  • Clean Lifecycle(清理生命周期)
    • 在进行真正的构建之前进行一些清理工作
      • 比如:下载的源码、接手的项目
    • 命令:clean,开发调试过程中使用率很高,避免手动清理 target 文件夹
  • Default Lifecycle(默认生命周期)
    • 构建的核心部分,编译,测试,打包,部署等等。
    • 命令:compile、test、package、install、deploy
  • Site Lifecycle(站点生命周期)
    • 生成项目报告、站点,发布站点。
    • 命令: site
  • 在同一个生命周期中的命令,执行后面的命令,前面的命令会自动被执行

  • clean
    • 清理命令,会删除 target 目录
  • compile
    • 编译命令,将 src/main/java 下的文件编译为 class 文件输出到target目录
  • test
    • 会执行一系列过程:清空 target 目录、编译 src/main 主干目录、编译 src/test 测试目录、逐一执行 test 目录下的测试代码
  • package
    • 打包
    • 打包类型默认为 jar 包,可在 pom.xml 中指定(参考上方 “新工程的 pom.xml 例行配置” )
  • install
    • 安装
    • 打包,并发布到本地仓库(就是前面设置的 Maven 本地依赖库)
  • deploy
    • 发布到服务器
  • 命令执行方式:在项目根目录下执行

工具栏执行 Maven 命令,方式一:

0729g.png
Maven 基础(7.工具栏 Maven 命令方式一)

工具栏执行 Maven 命令,方式二:

0729h.png
Maven 基础(8.工具栏 Maven 命令方式二)


有时遇到本地依赖库中的某个依赖未下载完整,或存在其他问题,需要重新下载

可以在 Maven 工具栏中,展开 Dependencies ,找到该依赖,右键执行 Download

0729i.png
Maven 基础(9.“补下载” 依赖)

依赖范围 编译 classpath 时
有效
测试 classpath 时
有效
运行 classpath 时
有效
举例
compile
(默认)
Yes Yes Yes mybatis
test No Yes No junit
provided Yes Yes No servlet-api
runtime No Yes Yse JDBC驱动

子工程间接依赖父工程的依赖

0729j.png
Maven 基础(10.依赖传递)

更常见的情形是,项目的依赖包,本身需要其他的依赖,项目就间接依赖了这些包

比如:spring-webmvc 依赖 spirng-beans-5.1.5,spring-aop 依赖 springbeans-5.1.6

Maven 的默认处理方式:依赖调解原则

  • 第一声明者优先原则
    • 在 pom.xml 文件中定义的依赖,以先声明的依赖为准。就是根据坐标导入的顺序来确定最终使用依赖。
  • 路径近者优先原则
    • 直接依赖大于依赖传递,直接在 pom.xml 文件中定义的依赖,优先于依赖传递的依赖

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<!-- 引入 SpringMVC 依赖时,排除其前置依赖 spring-beans -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.1.15.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- 引入 Spring-AOP 依赖 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>5.1.16.RELEASE</version>
</dependency>

使用 dependencyManagement 标签

该标签中的依赖包,并不会实际被引入,只有当项目直接或间接依赖了这些包,才会被引入,而且前置使用其指定的版本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!-- 锁定依赖版本 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.6.RELEASE</version>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <!-- 引入 SpringMVC 依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.1.15.RELEASE</version>
    </dependency>

    <!-- 引入 Spring-AOP 依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>5.1.16.RELEASE</version>
    </dependency>
</dependencies>

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93

<properties>
    <spring.version>5.1.5.RELEASE</spring.version>
    <springmvc.version>5.1.5.RELEASE</springmvc.version>
    <mybatis.version>3.5.1</mybatis.version>
</properties>

<!-- 锁定版本 -->
<dependencyManagement>
    <dependencies>
        
        <!-- Mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        
        <!-- springMVC -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${springmvc.version}</version>
        </dependency>
        
        <!-- spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

相关内容