Maven使用详解

229 阅读9分钟

​ 本文已参与【新人创作礼】活动,一起开启掘金创作之路。

目录

一、Maven概述

二、Maven 的核心概念

1. Maven 工程约定目录结构

2. pom 文件

3.仓库

4. Maven 的生命周期

5. Maven 的常用命令

6.插件

1)clean 插件 maven-clean-plugin:2.5

2) resources 插件 maven-resources-plugin:2.6

3)compile 插件 maven-compiler-plugin

4)test 测试插件

5) package 打包插件 maven-jar-plugin

6)deploy 发布插件 maven-install-plugin

常用插件

三、Maven在 idea 中的使用

1. 仓库配置

  2. 创建 maven 版 java 工程

3.目录介绍 

4.IDEA 中导入 Maven 工程(module)

 四、依赖管理

五、Maven 常用设置

1.全局变量

2.指定资源位置


一、Maven概述

1. 传统项目开发存在的问题

  • 一个项目做成一个工程,造成工程比较庞大,需要使用多模块来划分项目
  • 项目中需要的数量众多的 jar 包,需要手动下载并引入,并且多个项目需要的 jar 包存在重复的问题;
  • 项目中需要的 jar 包有版本兼容的问题,需要手动解决;
  • 项目中需要的 jar 包又依赖其它的 jar 包,需要手动解决。

2. Maven 是什么

Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理。

  • Maven 可以整合多个项目之间的引用关系,我们可以根据业务和分层需要任意拆分一个项目;
  • Maven 提供规范的管理各个常用 jar 包及其各个版本,并且可以自动下载和引入项目中;
  • Maven 可以根据指定版本自动解决 jar 包版本兼容问题;
  • Maven 可以把 jar 包所依赖的其它 jar 包自动下载并引入项目。

构建过程中的各个环节:清理、编译、测试、报告、打包、安装、部署。
①清理:删除以前的编译结果,为重新编译做好准备。
②编译:将Java源程序编译为字节码文件。
③测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
④报告:在每一次测试后以标准的格式记录和展示测试结果。
⑤打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java 工程对应 jar 包,Web工程对应war包。
⑥安装:在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中。
⑦部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行

二、Maven 的核心概念

1. Maven 工程约定目录结构

Hello
|---src
|---|---main
|---|---|---java
|---|---|---resources
|---|---test
|---|---|---java
|---|---|---resources
|---pom.xml

说明 :

Hello:根目录,也就是工程名
src:源代码
main:主程序
java:主程序的 java 源码
resources:主程序的配置文件
test:测试程序
java:测试程序的 java 源码
resources:测试程序的配置文件

pom.xml:Maven 工程的核心配置文件。

2. pom 文件

Maven 把一个项目的结构和内容抽象成一个模型,在 xml 文件中进行声明,以方便进行构建和描述,pom.xml 是 Maven 的灵魂。所以,maven 环境搭建好之后,所有的学习和操作都是关于 pom.xml 的。

属性说明:

modelVersion  Maven 模型的版本,对于 Maven2 和 Maven3 来说,它只能是 4.0.0
groupId组织 id,一般是公司域名的倒写。 格式可以为: 1. 域名倒写。例如 com.baidu 2. 域名倒写 + 项目名。例如com.baidu.appollo
artifactId项目名称,也是模块名称,对应groupId 中项目中的子项目。
version项目的版本号。如果项目还在开发中,是不稳定版本,通常在版本后带-SNAPSHOT。 version 使用三位数字标识,例如1.1.0
packaging项目打包的类型,可以使 jar、war、rar、ear、pom,默认是 jar
dependencies 和 dependencyMaven 的一个重要作用就是管理 jar 包,为了一个 项目可以构建或运行,项目中不可避免的,会依赖 很多其他的 jar 包,在 Maven 中,这些 jar 就被 称为依赖,使用标签 dependency 来配置。而这种 依赖的配置正是通过坐标来定位的,由此我们也不 难看出,maven 把所有的 jar 包也都视为项目存 在了
propertiesproperties 是用来定义一些配置属性的,例如 project.build.sourceEncoding(项目构建源码编码方式),可以设置为 UTF-8,防止中文乱码,也可定义相关构建版本号,便于日后统一升级。
buildbuild 表示与构建相关的配置,例如设置编译插件的 jdk 版本
parent在 Maven 中,如果多个模块都需要声明相同的配置,例如:groupId、version、有相同的依赖、或者相同的组件配置等,也有类似 Java 的继承机制,用 parent 声明要继承的父工程的 pom 配置。
modules在 Maven 的多模块开发中,为了统一构建整个项目的所有模块,可以提供一个额外的模块,该模块打包方式为 pom,并且在其中使用 modules 聚合的其它模块,这样通过本模块就可以一键自动识别模块间的依赖关系来构建所有模块,叫 Maven 的聚合。

3.仓库

1)仓库的概念

在Maven中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。Maven核心程序仅仅定义了自动化构建项目的生命周期,但具体的构建工作是由特定的构件完成的。而且为了提高构建的效率和构件复用,maven把所有的构件统一存储在某一个位置,这个位置就叫做仓库。

2)仓库存什么

  1. Maven 的插件,插件也是一些 jar,这些 jar 可以完成一定的功能。
  2. 我们自己开发项目的模块
  3. 第三方框架或工具的 jar 包

3)仓库的类别

根据仓库存储的位置,把仓库分为本地仓库和远程仓库。

本地仓库,存在于当前电脑上,默认存放在~.m2\repository中,为本机上所有的Maven工程服务。你也可以通过Maven的配置文件Maven_home/conf/settings.xml中修改本地仓库所在的目录。

~ 是用户的主目录,windows系统中是 c:/user/登录系统的用户名

远程仓库,分为为全世界范围内的开发人员提供服务的中央仓库、为全世界范围内某些特定的用户提供服务的中央仓库镜像、为本公司提供服务自己架设的私服。中央仓库是maven默认的远程仓库。

  • 中央仓库:通过Internet访问,为全世界所有 Maven工程服务。 最权威的。
  • 中央仓库的镜像:架设在不同位置,欧洲,美洲,亚洲等每个洲都有若干的服务器,为中央仓库
  • 分担流量。减轻中央仓库的访问,下载的压力。所在洲的用户首先访问的是本洲的镜像服务器。
  • 私服:在局域网环境中部署的服务器,为当前局域网范围内的所有 Maven工程服务。公司中常常使用这种方式。

​编辑

4)Maven 对仓库的使用

在 Maven 构建项目的过程中如果需要某些插件,首先会到 Maven 的本地仓库中查找,如果找到则可以直接使用;如果找不到,它会自动连接外网,到远程中央仓库中查找;如果远程仓库中能找到,则先把所需要的插件下载到本地仓库,然后再使用,并且下次再用到相同的插件也可以直接使用本地仓库的;如果没有外网或者远程仓库中也找不到,则构建失败。

4. Maven 的生命周期

对项目的构建是建立在生命周期模型上的,它明确定义项目生命周期各个阶段,构建项目时按照生命周期顺序构建,每一个阶段都有特定的插件来完成。不论现在要执行生命周期中的哪个阶段,都是从这个生命周期的最初阶段开始的。

对于我们程序员而言,无论我们要进行哪个阶段的构建,直接执行相应的命令即可,无需担心它前边阶段是否构建,Maven都会自动构建。 这也就是Maven这种自动化构建工具给我们带来的好处。

5. Maven 的常用命令

编译以下命令要在pom.xml所在目录下执行

1)mvn clean: 清理(会删除原来编译和测试的目录,即 target 目录,但是已经install 到仓库里的包不会删除)

maven-clean-plugin插件

2)mvn compile: 编译命令,执行的代码编译。

依次执行两个插件:

  • resources 插件: maven-resources-plugin:2.6,把项目需要的配置文件拷贝到指定的目录,默认是拷贝src\main\resources 目录下的件到 classes 目录下
  • compile 插件: maven-compiler-plugin,把src/main/java目录中的代码编译成class文件,同时把class文件拷贝到target/classes目录,这个classes目录是存放文件的根目录(也叫做类路径classpath)

3)mvn test-compile:编译命令,编译src/test/java目录中的源文件,把生成的class文件拷贝到target/test-classes目录,同时把src/test/java目录中的配置文件拷贝到test-classes目录,依旧是上面两个插件。

4)mvn test: 测试命令,执行test-classes目录的程序,测试src/main/java会目录中的主程序代码是否符合要求,在target生成surefire-reports目录,保存测试结果。

每次执行会把前面的阶段重新执行 

​编辑

maven-surefire-plugin插件 

​编辑

5)mvn package: 打包主程序(会编译、编译测试、测试、并且按照 pom.xml 配置把主程序打包生成 jar 包或者 war 包),默认是jar包

maven-jar-plugin插件:执行打包处理,生成一个jar扩展的文件,放在target目录下

例如:

 <groupId>com.itheima</groupId>
 <artifactId>web01</artifactId>
 <version>1.0-SNAPSHOT</version>
 <packaging>jar</packaging>

打包的文件名:artifactId-version.packaging

6)mvn install: 把生成的打包文件,安装到maven仓库

插件:maven-install-plugin

 <groupId>com.itheima</groupId>
 <artifactId>web01</artifactId>
 <version>1.0-SNAPSHOT</version>
 <packaging>jar</packaging>

groupId中的值,如果有 " . " 前后都是独立的文件夹。com\itheima

artifactId,独立的文件夹

version,独立的文件夹

7)mvn deploy: 部署主程序(会把本工程打包,按照本工程的坐标保存到本地库中,并且还会保存到私服仓库中。还会自动把项目部署到 web 容器中)。

6.插件

maven 过程构建周期,由 maven 的插件 plugin 来执行完成。

在项目根目录下执:mvn clean install

​编辑

1)clean 插件 maven-clean-plugin:2.5

clean 阶段是独立的一个阶段,功能就是清除工程目前下的 target 目录

2) resources 插件 maven-resources-plugin:2.6

resource 插件的功能就是把项目需要的配置文件拷贝到指定的目录,默认是拷贝src\main\resources 目录下的配置文件到 classes 目录下

3)compile 插件 maven-compiler-plugin

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

4)test 测试插件

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

5) package 打包插件 maven-jar-plugin

这个插件是把 class 文件、配置文件打成一个 jar(war 或其它格式)包

6)deploy 发布插件 maven-install-plugin

发布插件的功能就是把构建好的 artifact 部署到本地仓库,还有一个 deploy 插件是将构建好的 artifact 部署到远程仓库

常用插件

插件可以在自己的项目中设置,最常使用的是 maven 编译插件。设置项目使用的 jdk 版本时通过编译插件指定。pom.xml 文件中设置。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build> 

三、Maven在 idea 中的使用

1. 仓库配置

File---->Settings:设置 maven 安装主目录、maven 的 settings.xml 文件和
本地仓库所在位置。 

​编辑

  2. 创建 maven 版 java 工程

1) 创建maven版java工程

​编辑

 2)填写 maven 工程的坐标 

​编辑

3)填写工程名和存储路径 

​编辑

3.目录介绍 

​编辑

 ​编辑

​编辑对单个项目的pom文件重新导入 

​编辑

4.IDEA 中导入 Maven 工程(module)

1) 新建一个空的 project 作为工作空间

2) 在项目结构中导入或移除 module

​编辑

3)选择要导入的 Module

​编辑

 4) 选择导入方式

​编辑

 5)选择要导入的项目

​编辑

 6)选择要导入的 maven 工程

​编辑

7) 设置导入 module 所使用的 JDK 

​编辑

8) 导入后项目结构 

​编辑

 四、依赖管理

依赖的范围:compile、test、provided,默认采用 compile

compile:参与构建项目的所有过程

test:测试阶段使用

provided:提供者,项目在部署到服务器时,不需要提供这个依赖的jar包,而是由服务器提供这个依赖的jar包,明显的是servlet和jsp依赖,应当注意的是使用服务器带的jar包,否则产生依赖冲突,自己的jar包版本高于服务器的jar包,可能启动不起来项目。

compile test provided
对主程序是否有效是 否  
对测试程序是否有效
是否参与打包
是否参与部署
<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
</dependency>

五、Maven 常用设置

1.全局变量

在 Maven 的 pom.xml 文件中,用于定义全局变量,POM 中通过${property_name}的形式引用变量的值。

<properties>
    <spring.version>4.3.10.RELEASE</spring.version>
</properties>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
</dependency>

Maven 系统采用的变量:

<properties>
    <maven.compiler.source>1.8</maven.compiler.source> 源码编译 jdk 版本
    <maven.compiler.target>1.8</maven.compiler.target> 运行代码的 jdk 版本
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 项目构建使用的编码,避免中文乱码
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 生成报告的编码
</properties>

2.指定资源位置

src/main/java 和 src/test/java 这两个目录中的所有*.java 文件会分别在comile 和 test-comiple 阶段被编译,编译结果分别放到了 target/classes 和targe/test-classes 目录中,但是这两个目录中的其他文件都会被忽略掉,如果需要把 src 目录下的文件包放到 target/classes 目录,作为输出的 jar 一部分。需要指定资源文件位置。以下内容放到标签中。

<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>

\