maven的基本使用
1、maven的基本介绍
Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目。Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。
maven 可以管理 jar 文件,能自动下载 jar 和它的文档、源代码,能管理 jar 之间的依赖。Maven 能够帮助开发者完成以下工作:构建、文档生成、报告、依赖、SCMs、发布、分发、邮件列表。
为什么需要maven?:由于 Java 的生态非常丰富,无论你想实现什么功能,都能找到对应的工具类,这些工具类都是以 jar 包的形式出现的,例如 Spring,SpringMVC、MyBatis、数据库驱动,等等,都是以 jar 包的形式出现的,jar 包之间会有关联,在使用一个依赖之前,还需要确定这个依赖所依赖的其他依赖,所以,当项目比较大的时候,依赖管理会变得非常麻烦臃肿,这是 Maven 解决的第一个问题。
Maven 还可以处理多模块项目。简单的项目,单模块分包处理即可,如果项目比较复杂,要做成多模块项目,例如一个电商项目有订单模块、会员模块、商品模块、支付模块…,一般来说,多模块项目,每一个模块无法独立运行,要多个模块合在一起,项目才可以运行,这个时候,借助 Maven 工具,可以实现项目的一键打包。
2、安装配置maven
2.1、下载安装maven
Maven 是 Java 项目,因此必须先安装 JDK,JDK 安装配置可参考:https://www.cnblogs.com/wenxuehai/p/9492355.html
然后下载 maven,maven 的下载地址:http://maven.apache.org/download.cgi。下载路径如下图:
新版本可能会有一些问题,我们推荐使用 3.3.9 版本,历史版本下载可参考:https://blog.csdn.net/timexx/article/details/107827497
官网下载可能比较慢,提供一个 3.3.9 版本下载链接:链接:https://pan.baidu.com/s/1dLUrGfmdQq6UpVwze2Xmyg 提取码:dhrj
安装 maven 直接将下载的压缩包解压即可,解压下载文件后可看到目录如下:
2.2、配置maven环境变量
然后需要配置环境变量,配置环境变量跟 JDK 类似。
- 先在系统变量当中添加一个环境变量 MAVEN_HOME,变量值为 maven 的安装目录的根目录,比如:E:\develop\apache-maven-3.3.9
- 然后找到系统变量 Path,给该变量的值后面添加:;%MAVEN_HOME%\bin 即可
可参考:https://www.runoob.com/maven/maven-setup.html
检验 maven 安装是否成功,直接在命令窗口输入 mvn -v ,如果有输出 maven 的版本说明安装成功:
3、maven约定的目录结构
Maven 提倡使用一个共同的标准目录结构,Maven 使用约定优于配置的原则,大家尽可能的遵守这样的目录结构。一个使用Maven管理的普通的Java项目,它的目录结构默认如下:
MavenProject
|-- pom.xml maven项目的配置文件。对项目中的所有jar包依赖进行统一管理
|-- src
|-- main
| -- java 存放项目源代码
| -- resources(可省略) 存放项目配置文件 .xml等
|-- test(可省略)
| -- java 存放单元测试源代码
| -- resources 存放单元测试资源文件 .xml等
|-- target(由maven生成) 存放所有编译、打包生成的文件
|-- classes 存放项目源代码编译输出的字节码文件
|-- test-classes 存放测试代码编译输出的字节码文件
默认情况下,项目在编译过后,会将 src/main/java 编译过后的字节码文件和 src/main/resource 中的文件放在 target/classes 目录下。但是,src/main/java 目录下的非包且非java的文件在编译过后并不会自动被拷贝在 target/classes 目录下,而是会丢失。如果我们想要将 src/main/java 目录下的非包且非java的文件也一并拷贝在 target/classes 目录下,则需要在 pom.xml 文件的 build 标签下进行配置。
4、maven仓库配置
Maven 仓库是项目中依赖的第三方库。在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方。
Maven 仓库有以下几种类型:
- 本地仓库(local)
- 中央仓库
- 私服仓库
除本地仓库以外的仓库都可以叫做远程仓库。
当项目编译时,Maven首先从本地仓库中寻找项目所需的Jar包,若本地仓库没有,再到Maven的中央仓库下载所需Jar包。这 3 个仓库中,jar 包的查找顺序如下:
4.1、本地仓库
Maven 的本地仓库,在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建。默认位置:当前用户名\.m2\repository。
运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。
本地仓库默认位置在 当前用户名\.m2\repository
,我们也可以修改本地仓库的位置。在 maven 安装目录下的 conf/settings.xml 文件中可以修改,在该配置文件中可以看到 localRepository 节点被注释掉了,我们可以直接复制该节点,将值修改为本地路径即可,如下:
<!-- localRepository | The path to the local repository maven will use to store artifacts. | | Default: ${user.home}/.m2/repository <localRepository>/path/to/local/repo</localRepository> --> <localRepository>E:/develop/maven_repository</localRepository>
当你运行 Maven 命令,Maven 会将下载依赖的文件放到你指定的路径中。
4.2、中央仓库
中央仓库属于远程仓库的一种,Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等,一般来说,简单的Java项目依赖的包都可以在这里下载到。
中央仓库需要通过网络才能访问。低版本的 maven 中,比如 maven-2.0.10,可以在 ${M2_HOME}/lib/maven-2.0.10-uber.jar 中找到 pom.xml 配置文件。但是在 3.xxx 版本及之后的版本,在 maven 安装目录下的 lib/maven-model-builder-${version}.jar 下,可以在 \org\apache\maven\model\pom-4.0.0.xml 取到 pom-4.0.0.xml 配置文件,该配置文件是所有 Maven POM 的父 POM,所有Maven项目继承该配置。
你可以在 pom-4.0.0.xml 配置文件中找到如下配置信息:
<repositories> <repository> <id>central</id> <name>Central Repository</name> <url>https://repo.maven.apache.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
可以看到,中央仓库的id为central,远程url地址为 https://repo.maven.apache.org/maven2,它关闭了snapshot版本构件下载的支持。
4.3、私服仓库
私服也属于远程仓库的一种,一般来说,私服仓库搭建在公司局域网内,专供公司内部开发人员提供服务,不是对外使用的。
4.4、配置中央仓库
默认的中央仓库地址为 https://repo.maven.apache.org/maven2,但是国外的远程库下载速度比较慢,甚至可能会出现无法访问的问题,此时我们可以配置国内的仓库,比如阿里云中央仓库等。
4.4.1、在项目的 pom.xml 文件中配置中央仓库
配置我们自己的远程仓库有很多好处,比如你有一个局域网的远程仓库,使用该仓库能大大提高下载速度,继而提高构建速度,也有可能你依赖的一个 jar 在 central 中找不到,它只存在于某个特定的公共仓库,这样你也不得不添加那个远程仓库的配置。
我们可以在项目的 pom.xml 文件中配置远程仓库。比如下面配置远程仓库指向阿里云仓库:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <repositories> <repository> <id>maven-ali</id> <url>http://maven.aliyun.com/nexus/content/repositories/central</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> <updatePolicy>always</updatePolicy> <checksumPolicy>fail</checksumPolicy> </snapshots> </repository> </repositories> <groupId>org.example</groupId> <artifactId>springmvc_maven_test01</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> ... </project>
<repositories>下面可以添加多个<repository> ,每个<repository>都有它唯一的ID,一个描述性的name,以及最重要的远程仓库的url。<releases><enabled>true</enabled></releases> 告诉Maven可以从这个仓库下载 releases 版本的构件,而<snapshots><enabled>false</enabled></snapshots> 告诉Maven不要从这个仓库下载 snapshot 版本的构件,禁止从公共仓库下载snapshot构件是推荐的做法,因为这些构件不稳定,且不受你控制,你应该避免使用。当然,如果你想使用局域网内组织内部的仓库,你可以激活snapshot的支持。
4.4.2、在maven安装目录下的settings.xml文件配置
在项目的 pom.xml 文件中可以配置中央仓库,但是这样每个项目都需要配置一遍,需要重复工作。我们可以直接在 maven 安装目录下的 conf/settings.xml 文件中配置中央仓库。
找到 mirrors 标签,添加如下配置:
<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> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors>
可以看到 <mirrorOf> 的值是 central,意思就是用以上镜像替代 Maven 自带的中央仓库。
5、maven项目配置文件pom.xml
maven 安装目录下的 setting.xml 主要用于配置 maven 的运行环境等一系列通用的属性,是全局级别的配置文件。而 pom.xml 主要描述了项目的基本信息,用于描述项目如何构建,声明项目依赖等等,是项目级别的配置文件。执行任务或目标时,Maven 会在当前目录中查找 POM,然后读取 POM,获取所需的配置信息,然后执行目标。
pom(project object model)即项目对象模型,maven 把一个项目的结构和内容抽象成一个模型,在 xml 文件中进行声明,以方便进行构建和描述。
一个基本的pom.xml文件配置如下:
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <!-- maven模型的版本,对于maven2和maven3来说,只能是4.0.0 --> <modelVersion>4.0.0</modelVersion>
<!-- 公司或者组织的唯一标志,一般是公司域名的倒写,或者是公司域名倒写+项目名。并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group --> <groupId>com.companyname.project-group</groupId> <!-- 项目的唯一ID,一个groupId下面可以有多个项目,通过artifactId来区分 --> <artifactId>project</artifactId> <!-- 项目的版本号 --> <version>1.0.0</version> </project>
所有 POM 文件都需要 <project> 标签元素和该标签下的三个必需字段:groupId,artifactId,version。
groupId + artifactId + version = 坐标,坐标可用于标识互联网中的唯一资源。在Maven中,坐标是Jar包的唯一标识,Maven通过坐标在仓库中找到项目所需的Jar包。
5.1、pom.xml配置文件常见标签
pom.xml 配置文件的常见标签:
- <package>:项目打包的类型,例如jar、war、ear、pom等
- <dependencies>:项目相关的所有依赖
- <properties>:定义一些常量
- <build>:设置 maven 在进行项目的构建时的配置
使用示例如下:
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <groupId>com.companyname.project-group</groupId> <artifactId>project</artifactId> <version>1.0.0</version> <!--项目打包的类型,例如jar、war、ear、pom等,默认是jar-> <packaging>jar</packaging> <!--项目相关的所有依赖 --> <dependencies> <dependency> <groupId>xxx</groupId> <artifactId>xxx</artifactId> <version>xxx</version> </dependency> <dependency> ... </dependency> </dependencies> <!-- 在properties标签中可以自定义一些标签,以此来定义一些常量,在pom中的其它地方可以直接引用,使用方式如 :${test.uuid}。比如我们可以定义一些共用的依赖包版本号,这样版本号需要修改时只需修改这里一个地方即可 --> <properties> <file.encoding>UTF-8</file.encoding> <test.uuid>123</test.uuid> <java.source.version>1.5</java.source.version> </properties> <build> <!-- 打包生成的包的文件名,默认值是${artifactId}-${version}。 --> <finalName>myPorjectName</finalName> <!-- 构建产生的所有文件存放的目录,默认为${basedir}/target,即项目根目录下的target --> <directory>${basedir}/target</directory> ... </build> </project>
6、maven的三套生命周期
Maven的生命周期就是对所有的构建过程进行抽象和统一。包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有的构建步骤。Maven的生命周期是抽象的,即生命周期不做任何实际的工作,实际任务由插件完成,类似于设计模式中的模板方法。
Maven有三套相互独立的生命周期,分别是
- clean:项目清理的处理
- default(build):项目部署的处理
- site:项目站点文档创建的处理
每套生命周期各自包含一些阶段(phase),这些 phase 就相当于 Maven 提供的统一的接口,然后这些 phase 的实现由 Maven 的插件来完成。阶段是有顺序的,后面的阶段依赖于前面的阶段。各个生命周期相互独立,一个生命周期的阶段前后依赖。
比如:执行 mvn clean 命令:将会调用clean生命周期的 clean 阶段,实际上会执行 pre-clean 和 clean 阶段;执行 mvn test 命令:调用 default 生命周期的 test 阶段,实际执行 test 以及之前所有阶段;执行 mvn clean install:调用 clean 生命周期的 clean 阶段和 default 的install 阶段,实际执行 pre-clean 和 clean,install 以及之前所有阶段
6.1、clean生命周期
clean生命周期:清理项目,包含三个阶段:
- pre-clean:执行清理前需要完成的工作
- clean:清理上一次构建生成的文件
- post-clean:执行清理后需要完成的工作
6.2、default(build)生命周期
default生命周期:构建项目,重要的 phase(阶段)如下:
- validate:验证工程是否正确,所有需要的资源是否可用。
- compile:编译项目的源代码。
- test-compile:编译测试源码
- test:使用合适的单元测试框架来测试已编译的源代码。
- Package:把已编译的代码打包成可发布的格式,比如jar。
- integration-test:如有需要,将包处理和发布到一个能够进行集成测试的环境。
- verify:运行所有检查,验证包是否有效且达到质量标准。
- install:把包安装到maven本地仓库,可以被其他工程作为依赖来使用。
- Deploy:在集成或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。
6.3、site生命周期
site生命周期:建立和发布项目站点,phase如下
- pre-site:生成项目站点之前需要完成的工作
- site:生成项目站点文档
- post-site:生成项目站点之后需要完成的工作
- site-deploy:将项目站点发布到服务器
7、maven的常用命令
maven常用命令如下:
- mvn clean:清理。该命令会删除 maven 编译生成的目录,即 target 目录,但是已经 install 到本地仓库中的包不会删除。
- mvn compile:编译项目主代码,即 src/main 目录下的 java 程序。编译完成后会在项目根目录下生成一个 target/classes 目录,里面存放着 java 程序编译之后生成的字节码文件。并且 src/main/resource 目录下的文件都会被放到 target/classes 目录下
- mvn test-compile:编译项目中 src/test目录下的测试代码。编译完成后会在项目根目录下生成一个 target/test-classes 目录,里面存放着测试代码编译之后生成的字节码文件。
- mvn test:运行所有的测试代码
- mvn package:打包。按照 pom.xml 中的配置,将项目打成 jar 包或者 war 包。
- mvn install:安装本项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。
- mvn deploy:部署。将最终的项目包复制到远程仓库中与其他开发者和项目共享。
在命令行 CMD 上执行以上命令,需在命令行进入 pom.xml 所在目录下即项目的根目录下才能执行。
7.1、maven如何将web项目打包成war包
maven 将 java web 项目打包成 war 包,首先确认一下 pom.xml 中的配置的打包类型是打包成 war 包的:
确认好之后,通过命令行工具切换至该 web 项目的根目录下,执行 mvn clean package 命令即可:
打包完成后,可以在该项目的根目录下的 target 文件夹下找到一个 war 包。将该 war 包直接放到 tomcat 的 webapps 目录下即可部署成功。
部署:
8、maven的插件
Maven 生命周期的每一个阶段的具体实现都是由 Maven 插件实现的,Maven 实际上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成。例如编译源代码是由maven- compiler-plugin完成的。进一步说,每个任务对应了一个插件目标(goal),每个插件会有一个或者多个目标,
例如 maven- compiler-plugin 的 compile 目标用来编译位于 src/main/java/ 目录下的主源码,testCompile 目标用来编译位于 src/test/java/ 目录下的测试源码。我们在输入 mvn 命令的时候 比如 mvn clean,clean 对应的就是 Clean 生命周期中的 clean 阶段。但是 clean 的具体操作是由 maven-clean-plugin 插件来实现的。
用户可以通过两种方式调用 Maven 插件目标。第一种方式是将插件目标与生命周期阶段绑定,这样用户在命令行只是输入生命周期阶段而已,例如输入 mvn compile 命令,Maven 默认会将 maven-compiler-plugin 的 compile 目标与 compile 生命周期阶段绑定,因此命令mvn compile 实际上是先定位到 compile这一生命周期阶段,然后再根据绑定关系调用maven-compiler-plugin的compile目标。
第二种方式是直接在命令行指定要执行的插件目标,例如 mvn archetype:generate 就表示调用 maven-archetype-plugin 的 generate 目标,这种带冒号的调用方式与生命周期无关。
插件配置示例:
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <groupId>com.companyname.project-group</groupId> <artifactId>project</artifactId> <version>1.0.0</version> <build> <!-- 配置插件 --> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <!-- 插件名称 --> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <!-- 在这里给插件进行一些配置 --> <configuration> <source>1.6</source> <!-- 源代码使用的JDK版本 --> <target>1.6</target> <!-- 需要生成的目标class文件的编译版本。一般而言,target与source是保持一致的,但是,有时候为了让程序能在其他版本的jdk中运行,会存在target不同于source的情况 --> </configuration> </plugin> </plugins> </build> </project>
9、maven的依赖管理
依赖是 maven 项目引用的资源架包,依赖范围就是这些资源 jar 包在 maven 项目中的作用范围。maven 项目通过依赖范围来控制何时引用资源架包,比如我们需要在编译阶段用到某个 jar 包,我们可以指定该 jar 包的作用范围为 compile。
maven 的依赖范围用 scope 关键字表示,有五种依赖范围:
- compile:依赖范围的默认值,如果maven项目中引入一个依赖,没有添加scope依赖范围,那么默认的就是compile。这表示该 maven 项目在编译、测试、打包、安装、部署阶段都需要引用该依赖。
- test:表示该依赖包只和测试相关。
-
provided:表示maven项目只在编译和测试时引用该依赖,如果将项目打包运行时,则不会引入该依赖。如 servlet-api,这是 web 项目常用的架包,在项目编译和测试时都需要用到该架包,如果项目需要运行,则需要将项目部署到 tomcat 或其他 web 服务器上,但是 tomcat 中自带了 servlet-api,如果 maven 项目中引入了 servlet-api,那么会和 tomcat 中的 servlet-api 产生冲突,所以可以使用 provided 限定 servlet-api,让maven项目在打包时不再引入 servlet-api。
-
runtime和system:这两个是不常用的。runtime 表示在测试和部署运行阶段需要引入该依赖,在编译阶段不引入该依赖,如JDBC的驱动包,因为JDBC驱动是通过反射机制加载的,所以不参与项目编译过程。system 的作用域和 provided 类似,表示引用仓库之外的依赖,需要通过 systemPath 指定本地依赖的路径,除了特殊情况基本不使用。
依赖范围 | 是否作用于编译阶段 | 是否作用于测试执行阶段 | 是否作用于部署运行阶段 | |
1 | compile(默认值) | 是 | 是 | 是 |
2 | test | 否 | 是 | 否 |
3 | provided | 是 | 是 | 否 |
4 | runtime | 否 | 是 | 是 |
5 | system | 是 | 是 | 否 |
比如一个 java EE 项目,有 compile 和 test 作用范围的依赖包。因为 compile 需要作用在打包部署运行阶段,所以 compile 作用范围的依赖包在打包过后会被 maven 自动放在 项目war包/WEB-INF/lib 目录下;而 test 作用范围的依赖包则不会出现在 war 包中。
配置示例,Junit 只在测试阶段才起作用:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>maven_ee_01</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> </project>
10、maven中的资源拷贝插件
默认情况下,项目在编译过后,会将 src/main/java 编译过后的字节码文件和 src/main/resource 中的文件放在 target/classes 目录下。但是,src/main/java 目录下的非包且非java的文件在编译过后并不会自动被拷贝在 target/classes 目录下,而是会丢失。如果我们想要将 src/main/java 目录下的非包且非java的文件也一并拷贝在 target/classes 目录下,则需要在 pom.xml 文件的 build 标签下进行配置。
如果我们需要将 src/main/java 目录下的资源文件也拷贝到编译后(target/classes目录对应的文件夹下)或者打包后的目录下的话,就可以使用资源拷贝插件。示例如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>maven_ee_01</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <build> <!--resources标签需配置在<build></build>中,用来指定读取的配置文件或文件夹中的文件 --> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <!--filtering是否开启替换标签,若文件中有类似${key}这样的配置,就会根据maven的配置进行覆盖,让其使用真实值来填写 true表示开启替换,false表示不开启替换,无此标签表示不开启替换 真实值是从pom中profiles的配置里面取的--> <filtering>false</filtering> </resource> </resources> </build> </project>