Maven

2021-01-03   125 次阅读


Maven

1. 关于Maven的一些基本问题

1.1. Maven出现的原因

1.1.1. 传统项目开发中暴露出的问题

  • 项目中各个模块之间的关系管理随着项目的扩大愈加繁琐
  • 一些第三方功能模块需要的jar文件需要自行从网络上获取
  • jar文件的版本管理工作量愈来愈大
  • jar文件之间的依赖需要手动管理
    • a.jar 需要b.jar 这个关系叫做依赖
    • 项目中需要使用某个模块的驱动(比如mysql),叫做项目依赖mysql驱动

1.1.2. 什么是maven

  • Maven是Apache开源组织奉献的一个开源项目,其本质是一个项目管理工具。
  • Maven将项目开发和管理过程抽象成一个项目对象模型(POM)。开发人员只需做一些简单的配置,就可以批量完成项目的构建、报告和文档的生成工作。
  • Maven是跨平台的。
  • Maven最大化地消除了构建的重复,抽象了构建生命周期,为绝大部分的构建任务提供了已经实现的插件。
  • Maven实现了项目构建的标准化过程。

1.1.3. maven如何解决这些问题

  • maven可以管理jar文件
  • maven可以自动下载jar文件和它的文档、源代码,并自动解决冲突问题
  • Maven作为一个开放的架构,提供了公共接口,方便第三方插件的集成。
  • maven管理下载jar直接的依赖
  • maven可以管理jar版本
  • maven可以帮助编译程序,把java编译成class
  • maven可以监测代码的正确性
  • maven可以打包文件,形成jar文件,或者war文件
  • maven可以帮助部署项目

1.2. Maven项目的构建

maven项目的构建是面向过程的,完成项目代码的编译、测试、运行、打包、部署等。

maven支持的构建流程(也就是maven的生命周期):

  1. 清理:把之前项目编译的旧文件删除掉,为新的编译代码做准备

  2. 编译:把程序代码批量编译为可执行的文件,比如

    $.java \to .class$

  3. 测试:maven可以批量执行测试程序代码,验证代码功能是否正确。

  4. 报告:生成测试结果的文件

  5. 打包:把项目中的所有class文件、配置文件等所有资源放到一个压缩文件中。这个压缩文件就是项目的结果文件,统称java程序,压缩文件是jar扩展名。(对于web应用,压缩文件扩展名为.war)。

  6. 安装:把步骤五中生成的文件安装到本机仓库

  7. 部署:把程序安装好可以执行

1.3. Maven概念的介绍

  • POM:项目对象模型(Project Object Model),具体是一个 pom.xml 文件,maven把一个项目看作一个模型,可以控制maven构建项目的过程,管理jar依赖。
  • 约定的目录结构:maven项目的目录和文件结构有标准。
  • 坐标:是一个唯意的字符串,用来表示资源。
  • 依赖管理:管理你的项目可以使用的jar文件。
  • 仓库管理:资源的存放。
  • 生命周期:maven工具构建项目的过程。
  • 插件和目标:执行maven构建时用的工具就是插件。
  • 继承:一个maven项目可以继承另一个maven的依赖,成为子项目,父项目
  • 聚合:项目往往是由多个模块组成,通过maven的聚合特性能够帮助把项目的各个模块聚合到一起。

1.4. Maven目录介绍

  • bin:主程序文件夹,执行程序为mvn.cmd
  • conf:maven自身的配置文件,主要是settings.xml文件

2. Maven的核心概念

2.1. Maven工程约定目录结构

2.1.1. 约定

maven约定的目录结构,约定是大家都遵循的一个规则。

每一个maven项目在磁盘中都是一个文件夹(项目)。

2.1.2. 约定目录结构

[projectName]

/src

main——放置主程序和配置文件

java——主程序的程序包和java文件

resources——放置主java程序中要使用的配置文件

test——放置测试程序代码和文件

java——测试程序的程序包和java文件

resources——放置测试java程序中要使用的配置文件

pom.xml——maven的核心文件(不可或缺)

2.2. 编译指令

  • mvn compile:在项目根目录下生成target目录(结果目录),maven编译的java程序结果放在该目录中。具体过程为:
    • 编译main/java/目录下的java文件为class文件放在target/classes目录下
    • 同时把main/resources下的文件复制到target/classes下
  • mvn clean:清理(会删除原来编译和测试的目录(target),但是已经install到仓库里的包不会删除)
  • mvn test-compile:编译测试程序
  • mvn test:测试(会生成一个surefire-reports目录,保存测试结果)
  • mvn package:打包主程序(会编译、编译测试、测试、并且按照pom.xml配置把主程序打包生成jar包或者war包)
  • mvn install:安装主程序(会把本工程打包,并且按照本工程的坐标保存到本地仓库中)
  • mvn deploy:部署主程序(会把本工程打包,按照本工程的坐标保存到本地仓库,并且还会保存到私服仓库中,还会自动把项目部署到web容器中)。

2.3. maven仓库

2.3.1. 什么是仓库

用来存放maven使用的和我们使用的jar包。

  • maven使用的各种插件包(jar)
  • 项目使用的第三方工具(jar)

仓库的分类

  • 本地仓库,本地计算机的仓库
  • 远程仓库,在互联网上放置的仓库
    • 中央仓库:官方发布的集中使用的共享仓库
    • 中央仓库镜像:就是中央仓库的备份,在各大洲的重要城市都有镜像。
    • 私服:在公司内部局域网中使用,不对外开放。

2.3.2. maven本机仓库

默认为:C:\Users{username}\.m2\repository

目录修改:在settings.xml文件中,找到标签<localRepository></localRepository> 。将里面的内容修改为将要设置的目录地址。(不要有中文路径)

2.3.3. maven仓库的使用

maven仓库的使用不需要人为参与。

具体流程如下:

  • 开发人员需要使用mysql驱动
  • maven首先查询本地仓库
  • 再查询私服
  • 然后查询镜像
  • 最后查询中央仓库

2.4. POM文件

pom(Project Object Model)项目对象模型

标签 描述 备注
modelVersion Maven模型的版本,对于Maven2和Maven3来说,它只能是4.0.0
groupId 组织Id,一般是公司域名的倒写,也就是包的架构,比如:
1. 域名倒写:com.baidu
2. 域名倒写 + 项目名:com.baidu.appolo
groupId、artifactId、version三个元素后成一个maven项目的基本坐标,在众多的maven项目中可以唯一定位到某一个项目。坐标也决定着将来项目在仓库中的路径和名称。
artifactId 项目名称,也是模块名称,对应groupId中项目中的子项目。
version 项目的版本号。如果项目还在开发中,是不稳定版本,通常在版本后带 [-SNAPSHOT]
packaging 项目打包的类型,可以使jar、war、rar、ear、pom,默认是jar,web是war
dependencies/dependency 依赖 Maven的一个重要作用就是管理jar包,一个项目的构建或运行不可避免的会依赖很多其他的jar包,在maven中,这些jar就被称为依赖,使用标签dependency来配置。其也是通过坐标来定位
properties 配置属性 用来定义一些配置属性,包括编码格式等。
build 构建 表示与构建相关的配置,例如设置编译插件的jdk版本等。插件用< plugins > </plugins>标签。
parent 继承 在maven中,如果多个模块需要声明相同的配置,例如groupId、version、有相同的依赖、或者相同的组件配置等,也有类似java的继承机制,用parent声明要继承的父工程的pom配置。
modules 聚合 在maven的多模块开发中,为了统一构建整个项目的所有模块,可以提供一个额外的模块,该模块打包方式为pom,并且在其中使用modules聚合的其他模块,这样通过本模块就可以一件自动识别模块间的依赖关系来构建所有模块。

maven中央仓库地址:https://mvnrepository.com/

3. 测试

3.1. 单元测试

maven借助单元测试,批量的测试类中的大量方法是否符合预期。

  • 测试框架:junit,专门用于测试的框架(工具)

  • 测试方法:测试的是类中的方法,每一个方法都是独立测试的。方法是测试的基本单位(单元)。

  • 测试步骤:

    • 在src/test/java目录下,创建测试程序

      • 测试类的名称:Test+需要测试的类名

      • 测试的方法名称:Test+方法名

      • 比如:TestHello

    • 测试方法的书写规则

      • 方法必须是public
      • 方法没有返回值
      • 在方法前加上注解 @Test

4. Maven在IDEA中的使用

4.1.Maven在IDEA的配置

  • file——settings——Build,Excution,Deployment里设置maven的安装目录,配置文件和本机仓库

  • 在Build Tools——Maven——Runner

    VM Options:-DarchetypeCatalog=internal,取消模板下载,加快创建maven项目速度。

  • JRE的配置

4.2. 使用模板创建项目

  • maven-archetype-quickstart:普通的java项目
  • maven-archetype-webapp:web工程

注意有些模板中目录并不完整,自行添加目录时需要设置目录作用,即在新建目录右键后选择 Mark Directory as进行目录设置。

5. 依赖

5.1. 依赖范围

  • 使用scope表示。
  • scope的值有:compile,test,provided
  • scope表示依赖使用的范围,也就是在maven构建项目的生命周期中起作用。
  • 不写时默认是compile
  • test:表示被依赖项目仅仅参与测试相关的工作,包括测试代码的编译、执行。比如(junit.jar)
  • compile:表示被依赖项目需要参与当前项目的编译,后续的测试,运行也参与其中,几乎整个生命周期都要参与。
  • provided:意味着打包的时候可以不用包进去,别的设施(Web Container)会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。但是在打包阶段做了exclude操作。(比如说写web应用是Tomcat会提供servlet)

6. maven的常用操作

6.1. maven的常用设置

maven的设置在标签 <properties> 内。

<!-- maven构建项目使用编码,避免乱码 -->
<project.build.sourceEncoding></project.build.sourceEncoding>

<!-- 编译代码使用的jdk版本 -->
<maven.compiler.source></maven.compiler.source>

<!-- 运行程序时使用的jdk版本 -->
<maven.compiler.target></maven.compiler.target>

6.2. maven的全局属性

  1. 自定义属性

    • <properties> 通过自定义标签声明变量(标签名就是变量名)。
    • 在pom.xml文件中的其他位置,使用 ${标签名} 使用变量的值。
    • 自定义全局变量一般是定义依赖的版本号,当你的项目中要使用多个相同的版本号,先使用全局变量定义,在使用 ${标签名}
  2. 资源插件

    • 代码
    <build>
        <resources>
        	<resource>
        		<directory>src/main/java</directory><!-- 所在的目录 -->
        		<includes><!-- 包括目录下的.properties, .xml文件都会被扫描到 -->
        			<include>**/*.properties</include>
        			<include>**/*.xml</include>
        		</includes>
                <!-- filtering选项 false不启动过滤器, *.property已经起到过滤作用 -->
                <filtering>false</filtering>
        	</resource>
        </resources>
    </build>
    
    • 默认没有使用 <resources>的时候,maven执行编译代码时,会把src/main/resources目录下的文件拷贝到target/classes目录中。对于src/main/java目录下的除.java文件以外的文件不处理。
    • 我们的程序有需要把一些文件放在src/main/java目录中,当在执行java程序时,需要用到src/main/java目录中的文件。需要告诉maven在 mvn compile src/main/java目录下的程序时,需要把文件一同拷贝到target/classes目录中。此时就需要在<build>中加入<resources>

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

If you don't come, I will snow.