目录
一、为什么要Maven
二、安装与配置
2.1、官网下载安装包
2.2、配置环境变量
2.3、本地仓储配置
2.4、中央仓库配置
2.5、命令行创建maven项目
2.6、Jetty运行Web项目
2.7、在tomcat中运行
三、Maven概要
3.1、Maven名词解释
3.2、Maven的生命周期
3.3、Maven标准工程结构
3.4、Maven的"约束优于配置"
3.5、Maven的版本规范
3.6、项目骨架Maven Archetype
3.7、maven的项目对象模型
四、IDE中使用Maven(IDEA或Eclipse)
4.1、将现有项目转换成Maven项目
4.2、在IDEA中创建Maven项目
4.2.1、创建项目
4.2.2、配置Tomcat
4.2.3、war和war exploded的区别
4.2.4、修改项目结构
4.2.5、不能添加Servlet的解决方法
4.3、在Eclipse中创建Maven工程
Maven插件
Maven环境配置
创建Maven工程
4.4、使用Maven进行构建
4.5、创建Maven多模块项目
4.5.1、maven多模块优点
4.5.2、在IDEA中创建多模块项目
五、Maven中常用指令使用
5.1、在命令行中使用Maven指令
5.2、常用Maven命令
5.3、在IDE(集成开发工具)中使用指令
5.3.1、工具栏介绍
5.3.2、快捷执行Maven命令
六、使用指导
6.1、如何添加外部依赖jar包
6.2、如何寻找jar包
6.3、如何使用Maven插件(Plugin)
6.4、如何一次编译多个工程
6.5、常用Maven插件
七、常见问题
7.1、dependencies和dependencyManagement,plugins和pluginManagement的区别?
7.2、不能添加Servlet
七、视频
八、作业
一、为什么要Maven
在开发中经常需要依赖第三方的包,包与包之间存在依赖关系,版本间还有兼容性问题,有时还里要将旧的包升级或降级,当项目复杂到一定程度时包管理变得非常重要。
Maven是当前最受欢迎的Java项目管理构建自动化综合工具,类似以前Java中的Ant、node.js中的npm、dotNet中的nuget、PHP中的Composer。
Maven这个单词来自于意第绪语(犹太语),意为知识的积累。
Maven提供了开发人员构建一个完整的生命周期框架。开发团队可以自动完成项目的基础工具建设,Maven使用标准的目录结构和默认构建生命周期。Maven让开发人员的工作更轻松,同时创建报表,检查,构建和测试自动化设置。Maven简化和标准化项目建设过程。处理编译,分配,文档,团队协作和其他任务的无缝连接。 Maven增加可重用性并负责建立相关的任务。
每个Java项目的目录结构都没有一个统一的标准,配置文件到处都是,单元测试代码到底应该放在那里也没有一个权威的规范。
因此,我们就要用到Maven(使用Ant也可以,不过编写Ant的xml脚本比较麻烦)----一个项目管理工具。
Maven主要做了两件事:
统一开发规范与工具
统一管理jar包
如果没有Maven,你可能不得不经历下面的过程:
复制代码
1 如果使用了spring,去spring的官网下载jar包;如果使用hibernate,去hibernate的官网下载Jar包;如果使用Log4j,去log4j的官网下载jar包.....
2 当某些jar包有依赖的时候,还要去下载对应的依赖jar包
3 当jar包依赖有冲突时,不得不一个一个的排查
4 执行构建时,需要使用ant写出很多重复的任务代码
5 当新人加入开发时,需要拷贝大量的jar包,然后重复进行构建
6 当进行测试时,需要一个一个的运行....检查
复制代码
有了Maven,它提供了三种功能:
复制代码
1 依赖的管理:仅仅通过jar包的几个属性,就能确定唯一的jar包,在指定的文件pom.xml中,只要写入这些依赖属性,就会自动下载并管理jar包。
2 项目的构建:内置很多的插件与生命周期,支持多种任务,比如校验、编译、测试、打包、部署、发布...
3 项目的知识管理:管理项目相关的其他内容,比如开发者信息,版本等等
复制代码
官网:http://maven.apache.org/
教程:https://www.yiibai.com/maven/
Maven库:http://repo2.maven.org/maven2/
中央仓库资源:
http://mvnrepository.com/
https://search.maven.org/
二、安装与配置
其实主流的开发工具如IDEA、Eclipse都集成了Maven(可见重要性),但为了更加深刻的学习与管理该工具(比如多个IDE共享的问题),个人建议还是单独安装比较好。
2.1、官网下载安装包
在浏览器中打开下载地址:http://maven.apache.org/download.cgi
2.2、配置环境变量
注意:安装maven之前,必须先确保你的机器中已经安装了JDK,如果是Maven3则必须JDK1.7以上。
1.解压压缩包
2.添加环境变量MAVEN_HOME,值为apache-maven的安装路径(没有中文)
3.在Path环境变量的变量值末尾添加%MAVEN_HOME%\bin;
4.在cmd输入mvn –version,如果出现maven的版本信息,说明配置成功。
2.3、本地仓储配置
如果您不配置,默认会在如下位置存放从远程下载到的包:
从中央仓库下载的jar包,都会统一存放到本地仓库中。我们需要配置本地仓库的位置。
打开maven安装目录,打开conf目录下的setting.xml文件。
可以参照下图配置本地仓储位置。
你还可以在运行时指定本地仓库位置:
mvn clean install -Dmaven.repo.local=d:\yourpath
2.4、中央仓库配置
当构建一个Maven项目时,首先检查pom.xml文件以确定依赖包的下载位置,执行顺序如下:
复制代码
1、从本地资源库中查找并获得依赖包,如果没有,执行第2步。
2、从Maven默认中央仓库中查找并获得依赖包(http://repo1.maven.org/maven2/),如果没有,执行第3步。
3、如果在pom.xml中定义了自定义的远程仓库,那么也会在这里的仓库中进行查找并获得依赖包,如果都没有找到,那么Maven就会抛出异常。
复制代码
修改默认中央仓库地址
常用地址:
复制代码
1、http://www.sonatype.org/nexus/ 私服nexus工具使用
2、http://mvnrepository.com/ (推荐)
3、http://repo1.maven.org/maven2
4、http://maven.aliyun.com/nexus/content/groups/public/ 阿里云 (强力推荐)
5、http://repo2.maven.org/maven2/ 私服nexus工具使用
6、http://uk.maven.org/maven2/
7、http://repository.jboss.org/nexus/content/groups/public
8、http://maven.oschina.net/content/groups/public/
9、http://mirrors.ibiblio.org/maven2/
10、http://maven.antelink.com/content/repositories/central/
11、http://nexus.openkoala.org/nexus/content/groups/Koala-release/
12、http://maven.tmatesoft.com/content/groups/public/
复制代码
完整配置文件:
View Code
2.5、命令行创建maven项目
方法一:
输入命令 mvn archetype:generate,按回车,根据提示输入参数,如果是第一次使用,需要下载插件,稍等几分钟即可。
切换目录,输入指令
选择骨架(模板):
输入座标:
确认后下载骨架,成功后的提示如下:
将项目转换成IDEA项目:
成功后可以看到增加了项目信息:
在IDEA中就可以直接打开项目了:
将项目打包
输入指令:mvn package
打包成功后:
方法二:
在命令中指定参数
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=myapp -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
执行结果:
在命令行输入:
View Code
在命令行输入指令时请注意当前目录:
成功提示:
新建一个简单web项目
复制代码
mvn archetype:generate -DgroupId=com.zhangguo -DartifactId=webappdemo -Dpackage=com.zhangguo.webappdemo -DarchetypeArtifactId=maven-archetype-webapp -Dversion=1.0 -DinteractiveMode=No
复制代码
如果下载骨架的速度太慢,可以用-DarchetypeCatalog=指定下载位置,如下所示:
复制代码
mvn archetype:generate \
-DgroupId=com.mycom.helloworld \
-DartifactId=helloworld \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false \
-DarchetypeCatalog=http://maven.aliyun.com/nexus/content/groups/public/
复制代码
更多解决方法:https://www.cnblogs.com/del88/p/6286887.html
2.6、Jetty运行Web项目
是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供网络和web连接。
官网:http://www.eclipse.org/jetty/
jetty的特点:
View Code
maven项目直接在jetty中运行
2.6.1、修改pom,增加jetty插件:
复制代码
org.mortbay.jetty
maven-jetty-plugin
6.1.26
src/main/webapp
3
/jetty
4000
复制代码
2.6.2、将项目部署到jetty中运行:
mvn jetty:run //运行项目于jetty上,
2.6.3、在浏览器中输入访问地址:
http://127.00.0.1:4000/jetty
结束运行使用ctrl+c
2.6.4、idea中使用maven方式使用jetty
配置好后可直接点击idea中右边的maven选项卡,在plugins下有jetty选项,展开随便点那个都可以启动jetty,启动好后就可以在浏览器中输入地址访问web应用了。
2.7、在tomcat中运行
添加插件:
复制代码
org.codehaus.mojo
tomcat-maven-plugin
1.1
/wp
8080
UTF-8
http://localhost:8080/manager/html
tomcat6
复制代码
执行命令:
复制代码
tomcat:deploy --部署一个web war包
tomcat:reload --重新加载web war包
tomcat:start --启动tomcat
tomcat:stop --停止tomcat
tomcat:undeploy--停止一个war包
tomcat:run 启动嵌入式tomcat ,并运行当前项目
复制代码
三、Maven概要
Maven 是一个Java项目管理工具,主要功能是统一开发规范与包的依赖管理。
3.1、Maven名词解释
1. POM(Project Object Model)项目对象模型
Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。
POM 与 Java 代码实现了解耦,当需要升级版本时,只需要修改POM,而不需要更改Java代码,而在POM稳定后,日常的Java代码开发基本不涉及POM的修改。
2. 坐标
groupId , artifactId , version 三个元素是项目的坐标,唯一的标识这个项目。
groupId 项目所在组,一般是组织或公司
artifactId 是当前项目在组中的唯一ID;
version 表示版本,SNAPSHOT表示快照,表示此项目还在开发中,不稳定。
groupId 和实际项目不一定是一一对应的,maven 有模块的概念,例如 spring-core, spring-context...;groupId 也不应该只对应公司或组织名,建议具体到项目名,因为公司或者组织下有多个项目,而artifactId只能代表模块名。
复制代码
junit
junit
4.11
test
复制代码
3.依赖范围
1. compile : 编译,测试,运行都有效,默认的选择
2. test : 测试有效,例如junit
3. provided : 编译,测试有效,例如 servlet ,运行时容器会提供实现
4. runtime : 运行和测试有效,例如 jdbc,编译时只需相应的接口,测试和运行时才需要具体的实现
5. system : 编译,测试有效。使用此范围的依赖必须通过systemPath元素显式的指定依赖文件,因而
此类依赖是不通过Maven仓库解析的,一般适合于本机测试环境下,依赖本地起的服务。
构建
maven支持许多种的应用程序类型,对于每一种支持的应用程序类型都定义好了一组构建规则和工具集。
输出管理
maven可以管理项目构建的产物,并将其加入到用户库中。这个功能可以用于项目组和其他部门之间的交付行为
依赖关系
maven对依赖关系的特性进行细致的分析和划分,避免开发过程中的依赖混乱和相互污染行为
文档和构建结果
maven的site命令支持各种文档信息的发布,包括构建过程的各种输出,javadoc,产品文档等。
项目关系
一个大型的项目通常有几个小项目或者模块组成,用maven可以很方便地管理
移植性管理
maven可以针对不同的开发场景,输出不同种类的输出结果
Project: 项目
任何你想 build 的事物,Maven都会把它们当作是一个 Project。
这些 Project 被定义为 POM(Project Object Model)。
一个 Project 可以依赖其他的project,一个 project 也可以有多个子project组成。
POM:文档对象模型
POM(pom.xml) 是 Maven 的核心文件,它是指示 Maven 如何工作的元数据文件,类似 ant 的 build.xml 文件。
pom.xml 文件应该位于每个 Project 的根目录。
GroupId: 组织号
顾名思义,这个应该是公司名或组织名。
ArtifactId:项目名
构建出来的文件名,一般来说或,这个也是project名。
Packaging:打包
项目打包的类型,可以是将jar、war、rar、ear、pom,默认是jar。
Version:版本
项目的版本,项目的唯一标识由 groupId+artifactId+packaging+versionz 组成。
Dependency: 依赖
为了能够 build 或运行,一个典型的java project会依赖其他的包,在Maven中,这些被依赖的包就被称为 dependency。
Plug-in:插件
Maven是有插件组织的,它的每一个功能都是由插件提供的,主要的插件是由 java 来写的,但是他也支持 beanshell 和 ant 脚本编写的插件。
Repository:仓库
仓库用来存放artifact的,可以是本地仓库,也可以是远程仓库,Maven是由一个默认的仓库
Snapshot:快照
工程中可以(也应该)有这样一个特殊的版本:这个版本可以告诉Maven,该工程正在处于开发阶段,会经常更新(但还为发布)。当其他工程依赖此类型的artifact时,Maven会在仓库中寻找该artifact的最新版本,并自动下载、使用该最新版本。
3.2、Maven的生命周期
maven把项目的构建划分为不同的生命周期(lifecycle)。粗略一点的话,它这个过程(phase)包括:编译、测试、打包、集成测试、验证、部署。maven中所有的执行动作(goal)都需要指明自己在这个过程中的执行位置,然后maven执行的时候,就依照过程的发展依次调用这些goal进行各种处理。
这个也是maven的一个基本调度机制。一般来说,位置稍后的过程都会依赖于之前的过程。当然,maven同样提供了配置文件,可以依照用户要求,跳过某些阶段。
三种生命周期
Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
Site Lifecycle 生成项目报告,站点,发布站点。
下面列出了default、clean和site生命周期的所有构建阶段,这些阶段按照指定的顺序执行。
clean生命周期
执行阶段 描述说明
pre-clean 在实际的项目清理之前执行所需的过程
clean 删除前一个构建生成的所有文件
post-clean 执行完成项目清理所需的过程
Default生命周期
执行阶段 描述说明
validate 验证项目是正确的,所有必要的信息都是可用的。
initialize 初始化构建状态,例如设置属性或创建目录。
generate-sources 生成包含在编译中的任何源代码。
process-sources 处理源代码,例如过滤任何值。
generate-resources 生成包含在包中的资源。
process-resources 将资源复制并处理到目标目录中,准备打包。
compile 编译项目的源代码。
process-classes 从编译后生成生成的文件,例如在Java类上执行字节码增强。
generate-test-sources 生成包含在编译中的任何测试源代码。
process-test-sources 处理测试源代码,例如过滤任何值。
generate-test-resources 为测试创建资源。
process-test-resources 将资源复制并处理到测试目标目录中。
test-compile 将测试源代码编译到测试目标目录
process-test-classes 从测试编译后post-process生成文件,例如在Java类上执行字节码增强。对于Maven 2.0.5和以上。
test 使用合适的单元测试框架运行测试。这些测试不应该要求打包或部署代码。
prepare-package 在实际包装前执行必要的准备工作。这通常会导致包的一个未打包的、经过处理的版本。(Maven 2.1及以上)
package 使用已编译的代码,并将其打包成可部署格式,例如JAR。
pre-integration-test 执行集成测试之前需要执行的操作。这可能涉及到设置所需的环境等问题。
integration-test 在需要集成测试的环境中,处理并部署包。
post-integration-test 执行集成测试后所需要的操作。这可能包括清理环境。
verify 运行任何检查以验证包是否有效,并满足质量标准。
install 将该包安装到本地存储库中,作为本地其他项目的依赖项。
deploy 在集成或发布环境中完成,将最终包复制到远程存储库中,以便与其他开发人员和项目共享。
Site生命周期
执行阶段 描述说明
pre-site 在实际的项目站点生成之前执行过程
site 生成项目的站点文档
post-site 执行确定站点生成的过程,并为站点部署做好准备
site-deploy 将生成的站点文档部署到指定的web服务器
注意:执行某个生命周期的某个阶段不会影响其它的生命周期!
如果要同时执行多个生命周期的阶段可在命令行输入多个命令,中间以空格隔开,例如: clean package 该命令执行clean生命周期的clean阶段和default生命周期的package阶段。
3.3、Maven标准工程结构
Maven的标准工程结构如下:
3.4、Maven的"约束优于配置"
所谓的"约束优于配置",在maven中并不是完全不可以修改的,他们只是一些配置的默认值而已。但是除非必要,并不需要去修改那些约定内容。maven默认的文件存放结构如1.3所示。
每一个阶段的任务都知道怎么正确完成自己的工作,比如compile任务就知道从src/main/java下编译所有的java文件,并把它的输出class文件存放到target/classes中。
对maven来说,采用"约定优于配置"的策略可以减少修改配置的工作量,也可以降低学习成本,更重要的是,给项目引入了统一的规范。
3.5、Maven的版本规范
maven有自己的版本规范,一般是如下定义
..- ,比如1.2.3-beta-01。要说明的是,maven自己判断版本的算法是major,minor,incremental部分用数字比较,qualifier部分用字符串比较,所以要小心 alpha-2和alpha-15的比较关系,最好用 alpha-02的格式。
maven在版本管理时候可以使用几个特殊的字符串 SNAPSHOT,LATEST,RELEASE。比如"1.0-SNAPSHOT"。各个部分的含义和处理逻辑如下说明:
SNAPSHOT
这个版本一般用于开发过程中,表示不稳定的版本。
LATEST
指某个特定构件的最新发布,这个发布可能是一个发布版,也可能是一个snapshot版,具体看哪个时间最后。
RELEASE
是指仓库中最后的一个非快照版本
规范:
1、同一项目中所有模块版本保持一致
2、子模块统一继承父模块的版本
3、统一在顶层模块Pom的节中定义所有子模块的依赖版本号,子模块中添加依赖时不要添加版本号
4、开发测试阶段使用SNAPSHOT
5、生产发布使用RELEASE
6、新版本迭代只修改顶层POM中的版本
3.6、项目骨架Maven Archetype
什么是Maven Archetype? 简单的说就是一个Maven项目的基础模板,利用这个模板我们就可快速的建立一个新的该类型项目,同时也可以建立自己的项目骨架。
Maven所提供的archetype功能都是由插件Maven Archetype Plugin完成的
官网地址:http://maven.apache.org/archetype/maven-archetype-plugin/
主要命令:
archetype:generate 从项目骨架创建一个maven项目,老版本里使用的是archetype:create
archetype:create-from-project 根据一个项目创建项目骨架
使用archetype:generate创建项目
mvn archetype:generate命令参数解释
项目相关参数:
参数
含义
groupId
当前应用程序隶属的Group的ID
artifactId
当前应用程序的ID
package
代码生成时使用的根包的名字,如果没有给出,默认使用archetypeGroupId
原型有关参数表
参数 含义
archetypeGroupId
原型(archetype)的Group ID
archetypeArtifactId
原型(archetype)ID
archetypeVersion
原型(archetype)版本
archetypeRepository
包含原型(archetype)的资源库
archetypeCatalog
archetype分类,这里按位置分类有:
‘local’ 本地,通常是本地仓库的archetype-catalog.xml文件
‘remote’ 远程,是maven的中央仓库
file://...' 直接指定本地文件位置archetype-catalog.xml
http://...' or 'https://...' 网络上的文件位置 archetype-catalog.xml
'internal'
默认值是remote,local
filter
查找时过滤artifactId or groupId:artifactId
package
代码生成时使用的根包的名字,如果没有给出,默认使用archetypeGroupId
命令示例:
新建一个简单web项目
mvn archetype:generate -DgroupId=com.domain
-DartifactId=webappdemo
-Dpackage=com.domain.webappdemo
-DarchetypeArtifactId=maven-archetype-webapp
-Dversion=1.0 -DinteractiveMode=No
新建一个struts2 web项目
mvn archetype:generate -B -DgroupId=com.mycompany.mysystem
-DartifactId=myWebApp
-DarchetypeGroupId=org.apache.struts
-DarchetypeArtifactId=struts2-archetype-convention
-DarchetypeVersion=
-DremoteRepositories=http://struts.apache.org
maven默认提供的archetype类型可以参考http://maven.apache.org/guides/introduction/introduction-to-archetypes.html
从一个已有项目生成一个archetype
mvn clean archetype:create-from-project -Darchetype.properties=./archetype.properties -Darchetype.filteredExtentions=java,xml,jsp,properties,sql
这里首先定义了一个archetype.properties文件在命令行被执行的目录,里面的内容是
tablePrefix是QucikStart项目里用到的,想在新项目中替换掉的内容。
-Dfiltere