/*路径*/
C:\Users\用户名\.m2
这个路径下存放的就是idea带的maven
进入这个目录下之后,看到的maven的目录以及他的配置文件;
需要对setting.xml中的maven仓库进行修改,一般使用阿里镜像就可以了
aliyun
aliyun
central
https://maven.aliyun.com/repository/central
也是同样的方法进行修改,之后就可以直接创建maven项目了;
maven常用命令:
mvn -v //查看版本
mvn archetype:create //创建 Maven 项目
mvn compile //编译源代码
mvn test-compile //编译测试代码
mvn test //运行应用程序中的单元测试
mvn site //生成项目相关信息的网站
mvn package //依据项目生成 jar 文件
mvn install //在本地 Repository 中安装 jar
mvn -Dmaven.test.skip=true //忽略测试文档编译
mvn clean //清除目标目录中的生成结果
mvn clean compile //将.java类编译为.class文件
mvn clean package //进行打包
mvn clean test //执行单元测试
mvn clean deploy //部署到版本仓库
mvn clean install //使其他项目使用这个jar,会安装到maven本地仓库中
mvn archetype:generate //创建项目架构
mvn dependency:list //查看已解析依赖
mvn dependency:tree //看到依赖树
mvn dependency:analyze //查看依赖的工具
mvn help:system //从中央仓库下载文件至本地仓库
mvn help:active-profiles //查看当前激活的profiles
mvn help:all-profiles //查看所有profiles
mvn help:effective -pom //查看完整的pom信息
在创建项目的时候,直接创建maven项目就可以了:
点击finish就可以完成创建
创建之后的项目中是一个空的,只有一个maven的框架:他的pom文件如下
一个配置:
-Dmaven.wagon.http.ssl.insecure=true
-Dmaven.wagon.http.ssl.allowall=true
注:这里设置的忽略SSL证书验证,防止连不到阿里云的服务器无法自动下载依赖,而出现找不到依赖的错误 。
设置好后应用保存即可。
下面我们将通过 maven-archetype-quickstart 原型,在 D:\maven 目录中创建一个基于 Maven 的 Java 项目。
打开命令行窗口,跳转到 D:\maven 目录,执行以下 mvn 命令。
mvn archetype:generate
-DgroupId=net.biancheng.www
-DartifactId=helloMaven
-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
参数说明:
Maven 开始进行处理,并创建一套完整的 Maven 项目目录结构。
表示构建成功
目录及文件说明:
需要的依赖在项目中的pom.xm
l中进行配置;
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>3.8.1version>
<scope>compilescope>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>servlet-apiartifactId>
<version>2.5version>
<scope>providedscope>
dependency>
dependencies>
在这里添加依赖,按照他的既定格式进行添加;
groupId:存放的是这个依赖的包存放的位置(maven的本地仓库中)
artifactId:其中的是依赖的名字
version:放的是他的版本号;
当 Maven 根据坐标寻找构件时,它会首先查看本地仓库,若本地仓库存在此构件,则直接使用;若本地仓库不存在此构件,Maven 就会去远程仓库查找,若发现所需的构件后,则下载到本地仓库使用。如果本地仓库和远程仓库都没有所需的构件,则 Maven 就会报错。
远程仓库还可以分为 3 个小类:中央仓库、私服、其他公共仓库。
当通过 Maven 构建项目时,Maven 按照如下顺序查找依赖的构件。
对Scode的说明:
Maven的一个哲学是惯例优于配置(Convention Over Configuration), Maven默认的依赖配置项中,scope的默认值是compile,项目中经常傻傻的分不清,直接默认了。今天梳理一下maven的scope。
scope的分类
compile
默认就是compile,什么都不配置也就是意味着compile。compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。
test
scope为test表示依赖项目仅仅参与测试相关的工作,包括测试代码的编译,执行。比较典型的如junit。
runntime
runntime表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过编译而已,说实话在终端的项目(非开源,企业内部系统)中,和compile区别不是很大。比较常见的如JSR×××的实现,对应的API jar是compile的,具体实现是runtime的,compile只需要知道接口就足够了。oracle jdbc驱动架包就是一个很好的例子,一般scope为runntime。另外runntime的依赖通常和optional搭配使用,optional为true。我可以用A实现,也可以用B实现。
provided
provided意味着打包的时候可以不用包进去,别的设施(Web Container)会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是在打包阶段做了exclude的动作。
system
从参与度来说,也provided相同,不过被依赖项不会从maven仓库抓,而是从本地文件系统拿,一定需要配合systemPath属性使用。
scope的依赖传递
A–>B–>C。当前项目为A,A依赖于B,B依赖于C。知道B在A项目中的scope,那么怎么知道C在A中的scope呢?
当C是test或者provided时,C直接被丢弃,A不依赖C;
否则A依赖C,C的scope继承于B的scope。
<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.0modelVersion>
<groupId>org.examplegroupId>
<artifactId>maven_blogartifactId>
<version>1.0-SNAPSHOTversion>
<properties>
<maven.compiler.source>8maven.compiler.source>
<maven.compiler.target>8maven.compiler.target>
properties>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>3.8.1version>
<scope>compilescope>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>servlet-apiartifactId>
<version>2.5version>
<scope>providedscope>
dependency>
dependencies>
project>
1、POM(Project Object Model,项目对象模型)是 Maven 的基本组件,它是以 xml 文件的形式存放在项目的根目录下,名称为 pom.xml。
2、POM 中定义了项目的基本信息,用于描述项目如何构建、声明项目依赖等等。
2、当 Maven 执行一个任务时,它会先查找当前项目的 POM 文件,读取所需的配置信息,然后执行任务。在 POM 中可以设置如下配置:
4、所有的 Maven 项目都有一个 POM 文件,所有的 POM 文件都必须有 project 元素和 3 个必填字段:groupId、artifactId 以及 version。
5、在创建 POM 之前,首先要确定工程组(groupId),及其名称(artifactId)和版本,在仓库中这些属性是项目的唯一标识。
节点 | 描述 |
---|---|
groupId | 项目组 ID,定义当前 Maven 项目隶属的组织或公司,通常是唯一的。它的取值一般是项目所属公司或组织的网址或 URL 的反写,例如 net.biancheng.www。 |
artifactId | 项目 ID,通常是项目的名称。groupId 和 artifactId 一起定义了项目在仓库中的位置。 |
version | 项目版本。 |
无论 POM 文件中是否显示的声明,所有的 POM 均继承自一个父 POM,这个父 POM 被称为 Super POM,它包含了一些可以被继承的默认设置。
Maven 使用 effective pom (Super POM 的配置加上项目的配置)来执行相关任务,它替开发人员在 pom.xml 中做了一些最基本的配置。当然,开发人员依然可以根据需要重写其中的配置信息。
执行以下命令 ,就可以查看 Super POM 的默认配置。
mvn help:effective-pom
你可以看到 effective-pom 中包含了 Maven 在执行任务时需要用到的默认目录结构、输出目录、插件、仓库和报表目录等内容。
实际开发过程中,Maven 的 pom.xml 文件不需要手工编写,Maven 提供了大量的原型(Archetype)插件来创建项目,包括项目结构和 pom.xml。
6、构建项目
打开命令行窗口,跳转到 D:\maven\helloMaven 目录,执行以下 mvn 命令,对该项目进行构建。
mvn clean package
项目构建完成后,在该项目根目录中生成了一个名为 target 的目录,该目录包含以下内容。
说明:
1、Maven 坐标一套规则,它规定:世界上任何一个构件都可以使用 Maven 坐标并作为其唯一标识,Maven 坐标包括 groupId、artifactId、version、packaging 等元素,只要用户提供了正确的坐标元素,Maven 就能找到对应的构件。
2、任何一个构件都必须明确定义自己的坐标,这是 Maven 的强制要求,任何构件都不能例外。我们在开发 Maven 项目时,也需要为其定义合适的坐标,只有定义了坐标,其他项目才能引用该项目生成的构件。
Maven 坐标主要由以下元素组成:
这个生命周期将项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有构建过程进行了抽象和统一。
父类 LifeCycle 模拟的是 Maven 生命周期,子类 CleanPlugin 模拟的是 Maven 插件,而子类中重写的 clean() 模拟的是插件目标。
虽然示例中的代码与 Maven 实际代码相去甚远,但它们的基本理念是方法相同的。生命周期抽象了构建的各个步骤,定义了它们的执行顺序,但却没有提供具体的实现。插件中完成了对构建过程的实现,想要完成某个构建步骤,调用插件中的一个或多个插件目标即可。
生命周期中的每个构建过程都可以绑定一个或多个插件目标,且 Maven 为大多数的构建步骤都绑定了默认的插件。例如,针对源代码编译的插件是 maven-compiler-plugin、针对集成测试的插件是 maven-surefire-plugin 等。
注意:Maven 插件和插件在Maven 插件中会详细介绍。
Maven 拥有三套标准的生命周期:
每套生命周期包含一系列的构建阶段(phase),这些阶段是有顺序的,且后面的阶段依赖于前面的阶段。用户与 Maven 最直接的交互方式就是调用这些生命周期阶段。以 clean 生命周期为例,它包含 pre-clean、clean 以及 post-clean 三个阶段,当用户调用 pre-clean 阶段时,则只有 pre-clean 阶段执行;当用户调用 clean 阶段时,pre-clean 和 clean 阶段都会执行。当用户调用 post-clean 阶段时,则 pre-clean、clean 以及 post-clean 三个阶段都会执行。
通过将阶段名传递给 mvn 命令,就可以调用构建阶段,例如:
mvn install
与构建阶段的前后依赖关系不同,三套生命周期本身时相互独立的,用户可以只调用 clean 生命周期的某个阶段,也可以只调用 default 生命周期的某个阶段,而不会对其他生命周期造成任何影响。
clean 生命周期包括以下 3 个阶段。
下面我们将 maven-antrun-plugin 插件的 run 目标绑定到 pre-clean、clean 和 post-clean 三个阶段中,以实现在 clean 生命周期的各个阶段中显示自定义文本信息,pom.xml 配置如下:
4.0.0
net.biancheng.www
maven
0.0.1-SNAPSHOT
junit
junit
4.9
compile
log4j
log4j
1.2.17
org.apache.maven.plugins
maven-antrun-plugin
1.1
www.biancheng.net pre-clean
pre-clean
run
预清理阶段,编程帮 欢迎您的到来,网址:www.biancheng.net
www.biancheng.net clean
clean
run
清理阶段,编程帮 欢迎您的到来,网址:www.biancheng.net
www.biancheng.net post-clean
post-clean
run
后清理阶段,编程帮 欢迎您的到来,网址:www.biancheng.net
default 生命周期定义了项目真正构建时所需要的所有步骤,它是所有生命周期中最核心,最重要的部分。
default 生命周期包含非常多的阶段,如下表。
阶段 | 描述 |
---|---|
validate | 验证项目是否正确以及所有必要信息是否可用。 |
initialize | 初始化构建状态。 |
generate-sources | 生成编译阶段需要的所有源码文件。 |
process-sources | 处理源码文件,例如过滤某些值。 |
generate-resources | 生成项目打包阶段需要的资源文件。 |
process-resources | 处理资源文件,并复制到输出目录,为打包阶段做准备。 |
compile | 编译源代码,并移动到输出目录。 |
process-classes | 处理编译生成的字节码文件 |
generate-test-sources | 生成编译阶段需要的测试源代码。 |
process-test-sources | 处理测试资源,并复制到测试输出目录。 |
test-compile | 编译测试源代码并移动到测试输出目录中。 |
test | 使用适当的单元测试框架(例如 JUnit)运行测试。 |
prepare-package | 在真正打包之前,执行一些必要的操作。 |
package | 获取编译后的代码,并按照可发布的格式进行打包,例如 JAR、WAR 或者 EAR 文件。 |
pre-integration-test | 在集成测试执行之前,执行所需的操作,例如设置环境变量。 |
integration-test | 处理和部署所需的包到集成测试能够运行的环境中。 |
post-integration-test | 在集成测试被执行后执行必要的操作,例如清理环境。 |
verify | 对集成测试的结果进行检查,以保证质量达标。 |
install | 安装打包的项目到本地仓库,以供其他项目使用。 |
deploy | 拷贝最终的包文件到远程仓库中,以共享给其他开发人员和项目。 |
将 maven-antrun-plugin 插件的 run 目标绑定 default 生命周期的部分阶段中,以实现在 default 生命周期的特定阶段中显示定义文本信息。
sit 生命周期的目的是建立和部署项目站点,Maven 能够根据 POM 包含的信息,自动生成一个友好的站点,该站点包含一些与该项目相关的文档。
site 生命周期包含以下 4 个阶段:
aven 实际上是一个依赖插件执行的框架,它执行的每个任务实际上都由插件完成的。Maven 的核心发布包中并不包含任何 Maven 插件,它们以独立构件的形式存在, 只有在 Maven 需要使用某个插件时,才会去仓库中下载。
插件类型 | 描述 |
---|---|
Build plugins | 在项目构建过程中执行,在 pom.xml 中的 build 元素中配置 |
Reporting plugins | 在网站生成过程中执行,在 pom.xml 中的 reporting 元素中配置 |
对于 Maven 插件而言,为了提高代码的复用性,通常一个 Maven 插件能够实现多个功能,每一个功能都是一个插件目标,即 Maven 插件是插件目标的集合。我们可以把插件理解为一个类,而插件目标是类中的方法,调用插件目标就能实现对应的功能。
插件目标的通用写法如下。
[插件名]:[插件目标名]
例如,maven-compiler-plugin 插件的 compile 目标的通用写法如下。
maven-compiler-plugin:compile
使用 Maven 命令执行插件的目标,语法如下。
mvn [插件名]:[目标名]
例如,调用 maven-compiler-plugin 插件的 compile 目标,命令如下。
mvn compiler:compile
为了完成某个具体的构建任务,Maven 生命周期的阶段需要和 Maven 插件的目标相互绑定。例如,代码编译任务对应了default 生命周期的 compile 阶段,而 maven-compiler-plugin 插件的 compile 目标能够完成这个任务,因此将它们进行绑定就能达到代码编译的目的。
Maven 默认为一些核心的生命周期阶段绑定了插件目标,当用户调用这些阶段时,对应的插件目标就会自动执行相应的任务。
生命周期 | 阶段 | 插件目标 | 执行的任务 |
---|---|---|---|
clean | pre-clean | ||
clean | maven-clean-plugin:clean | 清理 Maven 的输出目录 | |
post-clean | |||
site | pre-site | ||
site | maven-site-plugin:site | 生成项目站点 | |
post-site | |||
site-deploy | maven-site-plugin:deploy | 部署项目站点 | |
default | process-resources | maven-resources-plugin:resources | 复制资源文件到输出目录 |
compile | maven-compiler-plugin:compile | 编译代码到输出目录 | |
process-test-resources | maven-resources-plugin:testResources | 复制测试资源文件到测试输出目录 | |
test-compile | maven-compiler-plugin:testCompile | 编译测试代码到测试输出目录 | |
test | maven-surefire-plugin:test | 执行测试用例 | |
package | maven-jar-plugin:jar/maven-jar-plugin:war | 创建项目 jar/war 包 | |
install | maven-install-plugin:install | 将项目输出的包文件安装到本地仓库 | |
deploy | maven-deploy-plugin:deploy | 将项目输出的包文件部署到到远程仓库 |
上表中,default 生命周期中只列出了绑定了插件目标的阶段,它还有很多其他的阶段,但这些阶段默认没有绑定任何插件目标,因此它们也没有任何实际的行为。
我们可以直接在执行 Maven 命令看到该构建过程包含了哪些插件目标。例如,在 Maven 项目中执行 mvn clean install 命令,能看到如下输出,图中标记的部分就是执行此命令时所调用的插件目标。
除了内置绑定之外,用户也可以自己选择将某个插件目标绑定到 Maven 生命周期的某个阶段上,这种绑定方式就是自定义绑定。自定义绑定能够让 Maven 在构建过程中执行更多更丰富的任务。
例如,我们想要在 clean 生命周期的 clean 阶段中显示自定义文本信息,则只需要在项目的 POM 中 ,通过 build 元素的子元素 plugins,将 maven-antrun-plugin:run 目标绑定到 clean 阶段上,并使用该插件输出自定义文本信息即可。
execution 下各个元素含义如下:
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>net.biancheng.wwwgroupId>
<artifactId>secondMavenartifactId>
<packaging>jarpackaging>
<version>1.0-SNAPSHOTversion>
<name>secondMavenname>
<url>http://maven.apache.orgurl>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>3.8.1version>
<scope>testscope>
dependency>
<dependency>
<groupId>net.biancheng.wwwgroupId>
<artifactId>helloMavenartifactId>
<scope>systemscope>
<version>1.0-SNAPSHOTversion>
<systemPath>D:\maven\helloMaven\target\helloMaven-1.0-SNAPSHOT.jarsystemPath>
dependency>
dependencies>
project>
Maven 不仅仅是一款项目构建和依赖管理工具,它还能够聚合项目信息,促进项目团队间地交流。POM 中可以包含各种项目信息,例如:项目描述、SCM 地址、许可证信息,开发者信息等。用户可以使用 Maven 提供的 maven-site-plugin 插件让 Maven 生成一个 Web 站点, 以站点的形式发布以上信息。
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>net.biancheng.wwwgroupId>
<artifactId>secondMavenartifactId>
<packaging>jarpackaging>
<version>1.0-SNAPSHOTversion>
<name>secondMavenname>
<url>http://maven.apache.orgurl>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-site-pluginartifactId>
<version>3.7.1version>
plugin>
plugins>
build>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>3.8.1version>
<scope>testscope>
dependency>
<dependency>
<groupId>net.biancheng.wwwgroupId>
<artifactId>helloMavenartifactId>
<scope>systemscope>
<version>1.0-SNAPSHOTversion>
<systemPath>D:\maven\helloMaven\target\helloMaven-1.0-SNAPSHOT.jarsystemPath>
dependency>
dependencies>
project>
或者
打开命令行窗口,跳转到 secondMaven 的目录中,执行如下 mvn 命令。
mvn site
Maven 命令运行完毕后,可以在项目的 target\site 目录下找到 Maven 生成的站点文件。
双击打开 index.html 查看站点。
Maven 项目第一构建时,会自动从远程仓库搜索依赖项,并将其下载到本地仓库中。当项目再进行构建时,会直接从本地仓库搜索依赖项并引用,而不会再次向远程仓库获取。这样的设计能够避免项目每次构建时都去远程仓库下载依赖,减轻了网络带宽的压力,但也带来了问题。
大型的应用软件通常由多个功能模块组成,这些模块一般分别于不同的团队负责开发。假设有两个团队,他们分别负责项目中的 app-ui(前端) 和 data-service(数据服务) 两个模块,且 app-ui 需要依赖 data-service 项目作为数据服务来源。
基于以上假设,若 data-service 团队正在进行快节奏的 bug 修复及功能增强,会在短时间内高频率地更新代码以及发布版本。就会出现以下情况:
这样,势必会影响开发效率,甚至会影响项目的验收及投产。要解决这个问题,其实很简单,那就是使用 SNAPSHOT(快照)版本。
SNAPSHOT(快照)是一种特殊的版本,它表示当前开发进度的副本。与常规版本不同,快照版本的构件在发布时,Maven 会自动为它打上一个时间戳,有了这个时间戳后,当依赖该构件的项目进行构建时,Maven 就能从仓库中找到最新的 SNAPSHOT 版本文件。
定义一个组件或模块为快照版本,只需要在其 pom.xml 中版本号(version 元素的值)后加上 -SNAPSHOT 即可,例如:
net.biancheng.www helloMaven jar 1.0-SNAPSHOT
要解决上面的问题,现在就十分简单了:data-servcie 团队每次更新代码都使用快照版本发布到仓库中,app-ui 团队则引用快照版本的依赖,这样 app-ui 不再需要重复修改 pom.xml 中的配置,每次构建时都会自动从仓库中获取最新的构件。
默认情况下对于快照本本的构件,Maven 会每天从仓库中获取一次更新,用户也可以在任何 Maven 命令中使用 -U 参数强制 Maven 检查更新。命令如下:
mvn clean package -U
Maven 仓库分为两种,Snapshot 快照仓库和 Release 发行仓库。Snapshot 快照仓库用于保存开发过程中的不稳定 SNAPSHOT 版本,Release 发行仓库则用来保存稳定的 RELEASE 版本。
Maven 会根据模块的版本号(pom.xml 文件中的 version 元素)中是否带有 -SNAPSHOT 来判断是 SNAPSHOT 版本还是正式 RELEASE 版本。带有 -SNAPSHOT 是SNAPSHOT(快照)版本,不带 -SNAPSHOT 的就是正式 RELEASE(发布)版本。
SNAPSHOT 版本和 RELEASE 版本区别如下表。
区别 | SNAPSHOT 版本 | RELEASE 版本 |
---|---|---|
定义 | 版本号中带有 -SNAPSHOT | 版本号中不带有 -SNAPSHOT |
发布仓库 | Snapshot 快照仓库 | Release 发行仓库 |
是否从远程仓库自动获取更新 | 在不更改版本号的前提下,直接编译打包时,Maven 会自动从远程仓库上下载最新的快照版本。 | 在不更改版本号的前提下,直接编译打包时,如果本地仓库已经存在该版本的模块,则 Maven 不会主动去远程仓库下载。 |
稳定性 | 快照版本往往对应了大量带有时间戳的构件,具有不稳定性。 | 发布版本只对应了唯一的构件,具有稳定性。 |
使用场景 | 快照版本只应该在组织内部的项目中依赖使用。 | Maven 项目使用的组织外的依赖项都应该时发布版本的,不应该使用任何的快照版本依赖,否则会造成潜在的风险。 |
发布前是否需要修改 | 当项目经过完善的测试后,需要上线时,应该将项目从快照版本更改为发布版本 | 不需要修改 |
打开命令行窗口,跳转到 D:\maven\secondMaven 目录,执行以下 mvn 命令。
mvn clean package -U
命令执行结果如下。
[INFO] Scanning for projects...[WARNING][WARNING] Some problems were encountered while building the effective model for net.biancheng.www:secondMaven:jar:1.0-SNAPSHOT[WARNING] 'dependencies.dependency.systemPath' for net.biancheng.www:helloMaven:jar should use a variable instead of a hard-coded path D:\maven\helloMaven\target\helloMaven-1.0-SNAPSHOT.jar @ line 37, column 16[WARNING][WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.[WARNING][WARNING] For this reason, future Maven versions might no longer support building such malformed projects.[WARNING][INFO][INFO] -------------------< net.biancheng.www:secondMaven >--------------------[INFO] Building secondMaven 1.0-SNAPSHOT[INFO] --------------------------------[ jar ]---------------------------------[INFO][INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ secondMaven ---[INFO] Deleting D:\maven\secondMaven\target[INFO][INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ secondMaven ---[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent![INFO] skip non existing resourceDirectory D:\maven\secondMaven\src\main\resources[INFO][INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ secondMaven ---[INFO] Changes detected - recompiling the module![WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent![INFO] Compiling 1 source file to D:\maven\secondMaven\target\classes[INFO][INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ secondMaven ---[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent![INFO] skip non existing resourceDirectory D:\maven\secondMaven\src\test\resources[INFO][INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ secondMaven ---[INFO] Changes detected - recompiling the module![WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent![INFO] Compiling 1 source file to D:\maven\secondMaven\target\test-classes[INFO][INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ secondMaven ---[INFO] Surefire report directory: D:\maven\secondMaven\target\surefire-reports-------------------------------------------------------T E S T S-------------------------------------------------------Running net.biancheng.www.AppTestTests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.008 secResults :Tests run: 1, Failures: 0, Errors: 0, Skipped: 0[INFO][INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ secondMaven ---[INFO] Building jar: D:\maven\secondMaven\target\secondMaven-1.0-SNAPSHOT.jar[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 2.413 s[INFO] Finished at: 2021-03-04T10:24:32+08:00[INFO] ------------------------------------------------------------------------
我们所接触的 Maven 项目的打包类型只有 JAR 和 POM ,但在现今的互联网时代,我们创建的大部分应用程序都是 Web 应用,在 Java 中 Web 应用的打包方式是 WAR。
通过使用 Maven 的 maven-archetype-webapp 模板可以创建一个简单的 Web 应用。
例如,在命令行窗口执行以下命令,Maven 会为我们创建一个 JavaWeb 应用。
mvn archetype:generate
-DgroupId=net.biancheng.www
-DartifactId=mavenWeb
-DarchetypeArtifactId=maven-archetype-webapp
-DinteractiveMode=false
index.jsp 代码如下。
Hello World!
Web 应用创建完成后,接下来我们将该应用进行打包成 war 文件,以便将其部署到服务器中。
打开命令行窗口,跳转到 mavenWeb 的目录,执行以下 mvn 命令,对该 Web 应用进行打包。
PS D:\java_springBoot\test06\test_web> mvn clean package
[INFO] Scanning for projects...
[INFO]
[INFO] --------------------------< com.zhl:test_web >--------------------------
[INFO] Building test_web Maven Webapp 1.0-SNAPSHOT
[INFO] --------------------------------[ war ]---------------------------------
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/plugins/maven-war-plugin/3.2.2/maven-war-plugin-3.2.2.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/plugins/maven-war-plugin/3.2.2/maven-war-plugin-3.2.2.pom (9.7 kB at 8.7 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/plugins/maven-war-plugin/3.2.2/maven-war-plugin-3.2.2.jar
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/plugins/maven-war-plugin/3.2.2/maven-war-plugin-3.2.2.jar (91 kB at 157 kB/s)
[INFO]
[INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ test_web ---
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ test_web ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\java_springBoot\test06\test_web\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ test_web ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:testResources (default-testResources) @ test_web ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\java_springBoot\test06\test_web\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ test_web ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-surefire-plugin:2.22.1:test (default-test) @ test_web ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-war-plugin:3.2.2:war (default-war) @ test_web ---
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/maven-archiver/3.2.0/maven-archiver-3.2.0.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/maven-archiver/3.2.0/maven-archiver-3.2.0.pom (4.3 kB at 9.5 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus-archiver/3.5/plexus-archiver-3.5.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus-archiver/3.5/plexus-archiver-3.5.pom (4.8 kB at 9.2 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus/5.0/plexus-5.0.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus/5.0/plexus-5.0.pom (21 kB at 30 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus-io/3.0.0/plexus-io-3.0.0.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus-io/3.0.0/plexus-io-3.0.0.pom (4.5 kB at 11 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/commons/commons-compress/1.14/commons-compress-1.14.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/commons/commons-compress/1.14/commons-compress-1.14.pom (13 kB at 23 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/tukaani/xz/1.6/xz-1.6.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/tukaani/xz/1.6/xz-1.6.pom (1.9 kB at 4.3 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus-archiver/3.6.0/plexus-archiver-3.6.0.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus-archiver/3.6.0/plexus-archiver-3.6.0.pom (4.8 kB at 11 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus-io/3.0.1/plexus-io-3.0.1.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus-io/3.0.1/plexus-io-3.0.1.pom (4.5 kB at 11 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/commons/commons-compress/1.16.1/commons-compress-1.16.1.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/commons/commons-compress/1.16.1/commons-compress-1.16.1.pom (16 kB at 29 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/commons/commons-parent/43/commons-parent-43.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/commons/commons-parent/43/commons-parent-43.pom (70 kB at 104 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/objenesis/objenesis/2.6/objenesis-2.6.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/objenesis/objenesis/2.6/objenesis-2.6.pom (2.8 kB at 6.5 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/objenesis/objenesis-parent/2.6/objenesis-parent-2.6.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/objenesis/objenesis-parent/2.6/objenesis-parent-2.6.pom (17 kB at 33 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/com/thoughtworks/xstream/xstream/1.4.10/xstream-1.4.10.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/com/thoughtworks/xstream/xstream/1.4.10/xstream-1.4.10.pom (15 kB at 25 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/com/thoughtworks/xstream/xstream-parent/1.4.10/xstream-parent-1.4.10.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/com/thoughtworks/xstream/xstream-parent/1.4.10/xstream-parent-1.4.10.pom (35 kB at 42 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/xmlpull/xmlpull/1.1.3.1/xmlpull-1.1.3.1.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/xmlpull/xmlpull/1.1.3.1/xmlpull-1.1.3.1.pom (386 B at 767 B/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.pom
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.pom (1.6 kB at 3.6 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/maven-archiver/3.2.0/maven-archiver-3.2.0.jar
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus-archiver/3.6.0/plexus-archiver-3.6.0.jar
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus-io/3.0.1/plexus-io-3.0.1.jar
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/commons/commons-compress/1.16.1/commons-compress-1.16.1.jar
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/objenesis/objenesis/2.6/objenesis-2.6.jar
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus-archiver/3.6.0/plexus-archiver-3.6.0.jar (191 kB at 256 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/com/thoughtworks/xstream/xstream/1.4.10/xstream-1.4.10.jar
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/codehaus/plexus/plexus-io/3.0.1/plexus-io-3.0.1.jar (74 kB at 84 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/xmlpull/xmlpull/1.1.3.1/xmlpull-1.1.3.1.jar
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/maven-archiver/3.2.0/maven-archiver-3.2.0.jar (24 kB at 26 kB/s)
Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/objenesis/objenesis/2.6/objenesis-2.6.jar (56 kB at 58 kB/s)
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/commons/commons-compress/1.16.1/commons-compress-1.16.1.jar (560 kB at 466 kB/s)
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/xmlpull/xmlpull/1.1.3.1/xmlpull-1.1.3.1.jar (7.2 kB at 5.4 kB/s)
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar (25 kB at 17 kB/s)
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/com/thoughtworks/xstream/xstream/1.4.10/xstream-1.4.10.jar (590 kB at 400 kB/s)
[INFO] Packaging webapp
[INFO] Assembling webapp [test_web] in [D:\java_springBoot\test06\test_web\target\test_web]
[INFO] Processing war project
[INFO] Copying webapp resources [D:\java_springBoot\test06\test_web\src\main\webapp]
[INFO] Webapp assembled in [71 msecs]
[INFO] Building war: D:\java_springBoot\test06\test_web\target\test_web.war
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 17.438 s
[INFO] Finished at: 2022-07-21T15:20:37+08:00
[INFO] ------------------------------------------------------------------------
PS D:\java_springBoot\test06\test_web>
http://c.biancheng.net/maven2/mirror.html