前段时间进行了一点maven的入门学习,在这里作个记录,但愿能帮到一些正在学习的朋友们。maven版本为3.3.9。但愿你们以为好的点个赞,以为很差的多提提意见和建议作个交流。这里也贴出我学习Maven的视频地址,你们也能够自行观看http://www.imooc.com/learn/443html
首先,在官网中下载maven组件。进入官网后,在左边菜单找到Download选项,点击进入Download页面。java
下拉页面,在File下选择合适的文件进行下载。web
Maven与JDK同样,须要配置环境变量,先创建一个M2_HOME变量,方便之后移动的时候修改路径,随后在Path中加入:%M2_HOME%\bin;spring
配置后在控制台输入 mvn -v ,出现maven及jdk的相关信息即为配置成功:apache
至此,便可完成maven环境变量的配置。api
maven工程与以往的java工程目录结构有所不一样,以往的java工程目录目录通常只有一个src用于存放包及java文件,而maven工程目录长这样: 浏览器
src
-main
-java
-包
-test
-java
-包缓存
通常咱们将一些主要的内容,放在main/java下面,而测试代码放在test/java下,这样在运行时,maven才能够识别目录并进行编译。tomcat
了解了目录结构后,就能够开始第一个maven项目了。(为了更加便于理解maven,暂时采用控制台+记事本Editplus的操做方式,IDE将在后面使用。)
服务器
先按照目录结构创建好目录:、
,这里包名为cn.edu.HelloWorld
先编写Hello.java:
1 package cn.edu.HelloWorld; 2 3 public class Hello{ 4 public String sayHello(){ 5 return "Hello Maven"; 6 } 7 }
再编写测试TestClass.java,这里使用junit4框架:
1 package cn.edu.HelloWorld; 2 3 import org.junit.*; 4 5 public class TestClass{ 6 @Test 7 public void testHello(){ 8 System.out.println(new Hello().sayHello()); 9 } 10 }
添加一个maven的配置文件pom.xml(该文件在一些开源框架中如struts,spring中能够找到,也能够百度进行下载,在这里也提供一份,以供复制):
<?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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <!--groupId、artifactId、version为必需,将在后面介绍--> <groupId>cn.edu.HelloWorld</groupId> <artifactId>maven01</artifactId> <version>0.0.1SNAPSHOT</version> <dependencies> <!--在这里引入junit4的依赖--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies> </project>
打开控制台,进入到工程的目录下,执行mvn compile命令:
看到BUILD SUCCESS表示编译成功(第一次编译可能须要下载环境比较慢)
编译成功后会在项目下生成一个target文件夹,里面存放编译后的文件
编译成功后执行mvn test命令,运行测试类:
看到SUCCESS便可看到结果,输出Hello Maven:
来看一下maven几个经常使用的构建命令,格式为mvn xxx:
mvn
-v 查看maven版本及其余相关信息
compile 编译maven项目,并生成target文件夹
test 运行test目录下的测试文件,即测试
package 将项目打包,默认打包为jar格式,也能够打包成war格式用于服务器运行
install 将打包的jar文件安装到maven本地仓库(仓库后面会详细介绍)
clean 删除targert,至关于清除缓存
在前面咱们采用手动的方式进行目录创建,显得略微有点繁琐,那么这里介绍一个插件用于生成符合maven规范的目录。
首先从控制台进入须要生成文件夹的位置,而后运行mvn archetype:generate(第一次须要下载组件比较慢,如果下载不下来能够设置一下maven的国内镜像库,百度即有步骤,这里不作介绍):
出现如下界面,提示咱们选择生成一个版本类型的maven结构,这里选择7(默认为7),quickstart:
确认后要求输入groupId、artifactId(也会做为文件夹名)、version(默认为1.0-SNAPSHOT)、package(即包的结构),这里依次输入:
提示确认,输入Y确认后进行生成。出现SUCCESS,则表示生成成功:
进入生成的项目中,输入mvn compile test进行确认:
打开文件夹便可看到咱们生成的文件目录,已经符合了maven规范,且能够运行。
maven使用groupId、artifactId、version表示坐标,每一个坐标都惟一的指向一个maven项目,简单介绍一下这几个标签
groupId:项目组织惟一的标识符,通常为反写的公司网址+项目名
artifactId:项目的惟一的标识符,通常为项目名+模块名
version:版本号 x.x.x+版本类型
第一个x表示大版本号
第二个x表示分支版本号
第三个x表示小版本号(可省略)
常见版本类型:
snapshot快照
alpha内部测试
beta公测
release稳定
GA正式发布
注:包名应与groupId+artifactId相吻合
maven中的依赖管理就是靠着仓库,仓库分为中央仓库及本地仓库。在编译项目时,maven会根据配置的依赖,先在本地仓库中进行搜索,如果没有则再去中央仓库进行搜索,而搜索即是采用坐标进行查找。
默认本地仓库位于C盘之下,若是进行还原系统之类的便会清空十分不便,这里说一下更改本地仓库路径的方法:
在maven组件目录下的conf文件夹内,有一个setting.xml,打开文件,搜索localRepository标签,使用localRepository标签修改路径便可
多个生命周期之间相互独立。每一个生命周期含有多个阶段,阶段按顺序执行,运行后阶段时,前阶段会自动执行。好比,直接运行mvn test命令,那么执行该命令时,会自动的附带mvn compile命令,由于test阶段在compile阶段以后。
完整的项目构建构成包括:
清理、编译、测试、打包、集成测试、验证、部署
clean 清理项目,包括如下阶段:
pre-clean 执行清理前
clean 清理上一次构建生成的全部文件
post-clean 执行清理后的文件
default 构建项目(核心:经常使用),包括如下阶段
compile 编译
test 测试
packeage 打包
install 安装
site 生成项目站点,根据pom中信息生成项目站点,包括如下阶段
pre-site 在生成项目站点前要完成的工做
site生成项目的站点文档
post-site在生成项目站点后要完成的工做
site-deploy发布生成的站点到服务器上
maven中提供了许多功能强大的插件,让咱们更好的管理项目。一个插件一般提供了一组目标,可以使用如下语法来执行:
mvn [plugin-name]:[goal-name]
例如咱们以前使用mvn archetype:generate,插件名为archetype,而目标为generate。咱们能够在官网的Plugins标签下,查找到插件的坐标及插件目标的详细描述。
Maven 提供如下两种类型插件:
类型 | 描述 |
---|---|
构建插件 | 在生成过程当中执行,并在 pom.xml 中的<build/> 元素进行配置 |
报告插件 | 在网站生成期间执行,在 pom.xml 中的 <reporting/> 元素进行配置 |
如下是一些常见的插件列表:
插件 | 描述 |
---|---|
clean | 编译后的清理目标,删除目标目录 |
compiler | 编译 Java 源文件 |
surefile | 运行JUnit单元测试,建立测试报告 |
jar | 从当前项目构建 JAR 文件 |
war | 从当前项目构建 WAR 文件 |
javadoc | 产生用于该项目的 Javadoc |
antrun | 从构建所述的任何阶段运行一组 Ant 任务 |
source | 从当前项目构建带源码的JAR文件 |
这里咱们经过使用source插件做为例子,来看看如何在maven中配置插件:
首先咱们快速建立一个maven项目(可使用archetype),在pom.xml中加入如下内容:
<build> <!-- 配置插件集 --> <plugins> <plugin> <!--使用插件的坐标进行引用 --> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>3.0.0</version> <executions> <execution> <!-- 绑定在哪一个过程时一同执行,这里咱们让它在使用package打包时一同执行 --> <phase>package</phase> <!--执行的目标类型,关于目标的详细介绍能够在maven官网中查到--> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
接下来,在命令控制台,输入mvn package查看结果:
出现成功信息后,能够在我项目的target中找到打包后的jar文件及src-jar文件
从这个例子中,咱们能够总结出如下几个关键点:
<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"> <!-- 当前pom的版本--> <modelVersion>4.0.0</modelVersion> <!--坐标--> <groupId>cn.edu</groupId> <artifactId>maven04</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 默认是jar,其余war zip pom等 --> <packaging>jar</packaging> <!--项目描述名 --> <name>maven04</name> <!-- 项目地址 --> <url>http://maven.apache.org</url> <!-- 配置参数 --> <properties> <!-- 这里配置项目编译编码为UTF-8--> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <!-- 开发人员信息 --> <developers></developers> <!-- 项目描述 --> <description></description> <!-- 许可信息 --> <licenses></licenses> <!-- 组织信息 --> <organization></organization> <!-- 依赖集,用于配置依赖 --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <!-- 依赖范围:这个jar包只在范围内生效,范围外引用会报错,这里让junit只在test时被依赖。 其余一些状况,如:servlet-api.jar,在编译阶段须要引用,而在服务器运行阶段则不须要引用,就可使用scope--> <scope>test</scope> <!-- 默认为false,子项目将会继承,true时子项目并需显式引用 --> <optional>false</optional> <!-- 排除依赖列表:用于去除传递依赖等,在后面会详细介绍--> <exclusions> <exclusion></exclusion> </exclusions> </dependency> </dependencies> <!-- 依赖管理 为依赖进行统一管理,若是在父项目中声明此标签时,在子项目中不需声明,确保父子项目依赖版本一致; 如子项目须要不一样版本的依赖,只需在子项目中进行声明便可,将会覆盖父项目中的声明。 --> <!-- <dependencyManagement> <dependencies> <dependency></dependency> </dependencies> </dependencyManagement> --> <!--配置构建时的属性--> <build> <plugins></plugins> </build> <!-- 指定父模块 --> <!-- <parent></parent> --> <!-- 用于聚合编译多个maven模块 --> <modules></modules> </project>
本节开始使用Eclipse进行编写,使用上与控制台方式出入不大。先略微介绍下Eclipse中构建maven项目:在新建项目时选择maven project(需安装maven插件,eclipse3.1以上自带)
设置好路径后在选择版本的界面,选择quickstart版本:
输入信息后点击finish便可构建maven项目:
完成步骤后,通常状况下会自动建立符合规范的maven项目。个别出现文件夹不符合规范的状况,可使用项目右键→new→source folder自行建立补充。
运行命令只要右键项目,run as→maven build的Goals中输入便可,这里输入时不需输入mvn。例如:mvn compile只需输入compile。
首先要知道,maven中提供了三种classpath:编译、测试、运行
scope标签
-compile 默认,编译测试运行均有效,会传递
-provided 在编译和测试时有效,如servletAPI能够加入,不传递
-runtime 在测试和运行时有效,如JDBCAPI能够加入
-test 在测试时有效,如junit能够加入
-system 在编译和测试时有效,与本机系统相关联,移植性差,在系统中之外部jar包的形式引入,不会在仓库中查找
-import 导入,只能用在dependecyManagement中,表示从其余pom中导入dependecy的配置
先来看看什么是传递依赖,好比如今有这么个状况:
C依赖B、B依赖A——C→B→A,那么此时C也会依赖A且会包含A中的依赖,这就是传递依赖。接下来咱们经过一个例子来详细了解依赖及如何消除传递依赖:
现有ABC三个项目:
A中额外依赖了一个commons-io的jar包:
B中对A进行依赖:
C中对B进行依赖:
保存以后能够看到,C中不但包含B,还包含A和A依赖的common-io:
那么如何消除传递依赖呢,这里就使用到<exclusion>标签了,在C中配置依赖B的地方加入如下内容:
保存后就能够看到,C中关于A的依赖消失了,传递依赖的问题就解决了。
假设如今有这么个状况:A依赖common-io的2.4版本,B依赖common-io的2.5版本,C依赖A、B,那么此时C中的common-io是哪一个版本的?
这就是依赖冲突,在maven中应对依赖冲突有两种解决方式:短路优先,先声明优先
先声明优先:顾名思义,在pom中,写在配置文件上面的优先,好比此时A的依赖配置在B之上,那C中就为2.4版本的common-io。
短路优先:优先选择依赖路径较短的一端。假设如今多出一个D,依赖状况改成D依赖B,C依赖A、D——C→A、C→D→B,那么这里就是A的依赖路径比较短,因此为2.4版本。
试想一下这样的状况,在一个项目中,分模块使用了maven,那么可能在这个项目中会有五六个,或者更多的maven项目存在。若是此时须要编译或测试要怎么办呢,进入每一个maven项目中进行mvn compile么,那就要执行五六次的compile命令,十分繁琐,这里就能够用maven的聚合来解决这个问题。
现有ABC三个工程,那么咱们使用一个新的工程D,来聚合他们,之后只要对D进行编译便可对三个工程同时进行编译。使用module标签进行聚合:
<modules> <!--这里的路径是基于D项目的pom.xml路径,module标签内为指向其余项目的pom文件的路径 这里个人ABCD项目在同一个文件夹内,那么从D内的pom中,经过../项目名,来找到其余项目的pom.xml--> <module>../A</module> <module>../B</module> <module>../C</module> </modules>
另外一种情形,若是多个maven项目具备相同的依赖时或配置时,那么应该如何处理呢?这里就用到继承的概念,在maven中使用<parent>标签来进行继承,下面经过一个例子来看一下:
首先创建一个项目,命名为parent,在parent的pom文件声明一个common-io的依赖,不过这里用到了dependencyManagement:
<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>cn.edu</groupId> <artifactId>parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <name>parent</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <!-- 在这里声明的依赖能够被子项目继承引用 --> <dependencies> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> </dependencies> </dependencyManagement> </project>
能够看到,虽然咱们在父项目中配置了依赖,可是却不会在父项目中被引用:
在子项目B中,配置继承parent并使用parent中的common-io版本:
<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>cn.edu</groupId> <artifactId>B</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>B</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <!-- 在parent标签中使用父项目的坐标进行配置 --> <parent> <groupId>cn.edu</groupId> <artifactId>parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <dependencies> <!-- 此处使用依赖时,就不需声明版本 --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> </project>
配置后保存便可看到,此处的依赖版本即为父项目中的版本:
这里介绍两种的web项目:规范目录的web项目及传统目录的web项目。再介绍使用两种服务器容器:tomcat和jetty运行的方法。因为tomcat中有许多的须要注意的问题,较为复杂,因此这里先从简单的jetty入手。
首先构建项目,此次选择版本的时候咱们选择webapp:
创建好后的webapp项目,其目录结构是这样的:
这里的resources文件夹用于存放java文件、包、xml配置文件等等,与咱们传统意义上的src文件夹是一致的。这里src下的webapp文件夹则等同于咱们Web项目中的WebRoot或WebContent,一些页面和样式等文件放在这个目录下。
接下来看看pom文件:
先注意到咱们这里的打包方式变为了war,web项目必需先编译打包,而后才能部署到web容器上运行。以后只需配置咱们的jetty运行插件。
<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.0</modelVersion> <groupId>cn.edu</groupId> <artifactId>mavenweb</artifactId> <packaging>war</packaging> <version>1.2.2-SNAPSHOT</version> <name>mavenweb Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>mavenweb</finalName> <plugins> <!--这里用到jetty的插件,在官网中能够找到坐标--> <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>9.4.1.v20170120</version> </plugin> </plugins> </build> </project>
先使用package命令进行打包,能够看到target中出现了咱们webapp文件夹下的内容,以及打包好的war文件。
复制使用这个war文件也可完成部署。但咱们这里使用jetty插件,在命令框中输入jetty:run命令,观察到
说明服务器启动完成。
接下来在浏览器使用localhost:8080便可看到咱们的项目中的index.jsp
至此就完成了咱们规范目录的web项目构建。
使用maven的web项目结构,可能会有少量的不习惯,或者咱们要将之前开发的项目转为mavenweb项目的话,那要怎么办呢?这里就介绍下非规范目录的web项目要如何构建。
首先,这是咱们的项目目录结构,java等文件仍是放在main/java下,而页面等其余资源文件放在WebContent下:
看看pom文件中的配置方法:
<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.0</modelVersion> <groupId>cn.edu</groupId> <artifactId>mavenweb</artifactId> <packaging>war</packaging> <version>1.2.2-SNAPSHOT</version> <name>mavenweb Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>mavenweb</finalName> <!-- 资源集 --> <resources> <!-- 非规范资源文件目录打包 --> <resource> <!-- 指定资源存放的目录(必需,不写会报错),即resources目录的变动。如下配置中的的相对目录改成该目录 --> <directory>src/main/java</directory> <includes> <include>*.xml</include> </includes> <!-- 是否替换资源文件中的属性,如${username},替换为pom中指定的properties--> <filtering>false</filtering> </resource> </resources> <plugins> <!--这里使用到war plugin,一样的,详细介绍及坐标在官网中能够找到--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.0.0</version> <configuration> <!-- 指定web.xml的文件位置 --> <webXml>WebContent/WEB-INF/web.xml</webXml> <!-- war的源目录,由哪一个文件夹打包成war文件,用于更改页面样式等的资源目录 --> <warSourceDirectory>WebContent</warSourceDirectory> </configuration> </plugin> <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>9.4.1.v20170120</version> </plugin> </plugins> </build> </project>
完成配置后,使用package命令进行打包。看到target中的打包结果,确实更改了来源目录并打包成功:
接下来使用jetty:run或jetty:deploy等运行命令便可成功运行项目。
使用tomcat时,会赶上许多的问题,在这里整理,但愿能帮上一些朋友。
问题一:tomcat插件版本问题
tomcat这个插件在官网的描述中是这样的:
那么我这里使用的是tomcat7,我就使用了下面的那份坐标,可是在使用tomcat:run命令是发现:
也是找了很久才发现这个问题,我明明使用的是tomcat7的插件,可是运行起来倒是不知道哪里来的6.0版本。
正确的方式是:运行tomcat7:run命令,其实这点在官网中也有提到,怪本身没认真看了。
tomcat:run默认使用的是6.0版本的tomcat,可是奇怪的一点,我机子上并无6.0版本的tomcat,那么这里的是哪来的呢?但愿有大神知晓的可以解答,先谢过了!
问题二:Cannot invoke Tomcat manager: Server rened HTTP response code: 403 for URL
这个问题,第一是要打开tomcat的Manage权限,在百度有许多相关的解决方法,我就很少说了。这里贴几个我以为写的还不错的帖子:
http://blog.csdn.net/u012052168/article/details/52448943
https://my.oschina.net/angel243/blog/178554
第二个点,也是我赶上的主要问题:Eclipse的tomcat的webapp目录为workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps,而并不是$CATALINA_HOME/webapp,这也就致使了Eclipse中启动tomcat的话,是没有Root、Manage等项目的,更不用说Manage权限了。
解决方式:http://blog.csdn.net/snakewarhead/article/details/6175833
最后,贴上最终个人pom文件,供你们作个参考:
<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.0</modelVersion> <groupId>cn.edu</groupId> <artifactId>mavenweb</artifactId> <packaging>war</packaging> <version>1.2.2-SNAPSHOT</version> <name>mavenweb Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.struts/struts2-core --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.5.8</version> </dependency> </dependencies> <build> <finalName>mavenweb</finalName> <!-- 资源集 --> <resources> <!-- 非规范资源文件目录打包 --> <resource> <!-- 指定资源存放的目录(必需,不写会报错)基础目录,如下目录全在该目录下 --> <directory>src/main/java</directory> <includes> <include>*.xml</include> </includes> <!-- 是否替换资源文件中的属性,如${username},替换为pom中指定的properties--> <filtering>false</filtering> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.0.0</version> <configuration> <!-- 指定web.xml的文件位置 --> <webXml>WebContent/WEB-INF/web.xml</webXml> <!-- war的源目录,由哪一个文件夹打包成war文件,用于更改资源目录 --> <warSourceDirectory>WebContent</warSourceDirectory> <!-- <webappDirectory>WebContent</webappDirectory> 打包的目标目录--> </configuration> </plugin> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <url>http://localhost:8080/manager/html</url> <server>tomcat7</server> <!-- 此处的名字必须和setting.xml中配置的ID一致 --> <username>admin</username> <password>root</password> <path>/mavenweb</path> <!-- 此处的名字是项目发布的工程名 --> </configuration> </plugin> <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>9.4.1.v20170120</version> </plugin> </plugins> </build> </project>