一。安装
1.安装检查
下载地址:http://maven.apache.org/ download.html
下载最新版本:apache-maven-3.5.2-bin.zip 解压到任意文件夹,同时设置环境变量。M2_HOME = 解压位置 ; Path中添加%M2_HOME%\bin;
设置完毕检查:mvn -v 出现Apache Maven 3.5.2说明成功,否则检查环境变量设置是否正确。
2.安装目录下查看文件目录
LICENSE.txt :包含了Apache Maven的软件许可证
NOTICE.txt :包含了一些Maven依赖的类库所需要 的通告及权限
README.txt :包含了一些安装指令 bin/ :包含了运行Maven的 mvn脚本
boot/ :包含了一个负责创建Maven运行所需要的类装载器的JAR文件
conf/ :包含了一个全局的settings.xml文件,该文件包含了用户相关的认证,仓库和其它信息的配置,用来自定义Maven的行 为
lib/ :包含Maven核心的JAR文件
3.maven-help-plugin插件
help:active-profiles 列出当前构建中活动的Profile(项目的,用户的,全局的)。
help:effective-pom 显示当前构建的实际POM,包含活动的Profile。
help:effective-settings 打印出项目的实际settings, 包括从全局的settings和用户级别settings继承的 配置。
help:describe 描述插件的属性。它不需要在项目目录下运行。但是你必须提供你想要描述插件 的 groupId 和 artifactId。
命令
mvn help:describe -Dplugin=help
如果你想要 Help 插件输出完整的带有参数的目标列表,只要运行带有参数 full的 help:describe目标就可以了
mvn help:describe -Dplugin=help –Dfull
mojo该选项能让你查看插件所有的目标及相关参数。但是有时候这些信息显得太多了。这 时候你可以获取单个目标的信息,设置 mojo参数和 plugin参数。下面的命令列出了 Compiler 插件的 compile目标的所有信息
mvn help:describe -Dplugin=compiler -Dmojo=compile –Dfull
看settings文件
mvn help:effective-settings
二。实战
1.创建简单项目并打包
创建一个名字为testweb,包名为com.yy.testweb 的java项目
mvn archetype:generate -DarchetypeCatalog=internal -DgroupId=com.yy.testweb -DartifactId=testweb -DarchetypeArtifactId=maven-archetype-quickstart
说明:archetypeArtifactId(项目骨架的类型)
* maven-archetype-archetype * maven-archetype-j2ee-simple * maven-archetype-mojo * maven-archetype-portlet * maven-archetype-profiles (currently under development) * maven-archetype-quickstart * maven-archetype-simple (currently under development) * maven-archetype-site * maven-archetype-site-simple * maven-archetype-webapp
将编译好的代码打包成可分发的格式,如 JAR,WAR:mvn package
测试构建好的项目:java -cp target\testweb-1.0.0.jar com.yy.testweb.App
pom.xml查看:mvn help:effective-pom
2.核心概念
当你下载Maven的时候,你得到的是一个包含了基本躯壳的Maven 核心,它知道如何解析命令行,管理classpath,解析POM文件,在需要的时候下载 Maven插件。通过保持插件和Maven核心分离,并且提供更新机制,用户很容 易能使用编译器最新的版本。通过这种方式,Maven插件提供了通用构建逻辑的全局重用性,有不会在构建周期中定义编译任务,有使用了所有Maven用户共享的插件。如果有个对单独插件的改进,每个使用Maven的项目可以立刻从这种变化中得到好处。
1)插件和目标(Plugins and Goals)
Maven插件是一个单个或者多个目标的集合,如创建项目的命令中 archetype是插件标识,generate是目标,通过命令mvn archetype:generate 运行创建项目的插件目标。后面的-DgroupId,-DartifactId,-DarchetypeArtifactId 用于传入参数。某些参数会有默认值,例如version,archetypeArtifactId。
2)生命周期 (Lifecycle)
如命令 mvn package。生命周期是包含在一个项目构建中的一系列有序的阶段。Maven可以支持许多不同的生命周期,但是最常用的生命周期是默认的Maven生命周期,这个生命周期中一开始的一个阶段是验证项目的基本完整性,最后的一个阶段是把一个项目发 布成产品。插件目标可以附着在生命周期阶段上。随着Maven沿着生命周期的阶段移动,它会执行附着在特定阶段上的目标。每个阶段可能绑定了零个或者多个目标。简单的可以理解为,一个生命周期有不同阶段,每个阶段执行了一些绑定的插件目标。
例如 mvn package,会有多个多个阶段,每个阶段绑定了插件目标如下:
resources:resources Resources插件的resources目标绑定到了resources阶段。这个目标复制src/ main/resources下的所有资源和其它任何配置的资源目录,到输出目录。
compiler:compile Compiler插件的compile目标绑定到了compile阶段。这个目标编译src/main/ java下的所有源代码和其他任何配置的资源目录,到输出目录。
resources:testResources Resources插件的testResources目标绑定到了test-resources阶段。这个目标复 制src/test/resources下的所有资源和其它任何的配置的测试资源目录,到测试 输出目录。
compiler:testCompile Compiler插件的testCompile目标绑定到了test-compile阶段。这个目标编 译src/test/java下的测试用例和其它任何的配置的测试资源目录,到测试输出 目录。
surefire:test Surefire插件的test目标绑定到了test阶段。这个目标运行所有的测试并且创 建那些捕捉详细测试结果的输出文件。默认情况下,如果有测试失败,这个目标 会终止。 一个简单的Maven项目 30
jar:jar Jar插件的jar目标绑定到了package阶段。这个目标把输出目录打包成JAR文 件。
当我们运行mvn package,Maven运行到打包为止的所有阶段,在Maven沿 着生命周期一步步向前的过程中,它运行绑定在每个阶段上的所有目标。你也可以像下 面这样显式的指定一系列插件目标,以得到同样的结果:
mvn resources:resources compiler:compile resources:testResources compiler:testCompile surefire:test jar:jar
生命周期:
验证(validate)- 验证项目是否正确,所有必要的信息可用
编译(compile)- 编译项目的源代码
测试(test)- 使用合适的单元测试框架测试编译的源代码。这些测试不应该要求代码被打包或部署
打包(package)- 采用编译的代码,并以其可分配格式(如JAR)进行打包。
验证(verify)- 对集成测试的结果执行任何检查,以确保满足质量标准
安装(install)- 将软件包安装到本地存储库中,用作本地其他项目的依赖项
部署(deploy)- 在构建环境中完成,将最终的包复制到远程存储库以与其他开发人员和项目共享。
清理(clean)- 清理target目录
站点(site)- 生成站点文档
3)坐标 (Coordinates)
目标在POM的上下文中运行。目标是我们 希望针对项目运行的动作,而项目是通过POM定义的。POM为项目命名,提供了项目的一 组唯一标识符(坐标),并且通过依赖 (dependencies) ,父 (parents) 和先决条件 (prerequisite) 来定义和其它项目的关系。
pom中的groupId, artifactId, version和packaging,这些组合的 标识符拼成了一个项目的坐标。当一个项目通过依赖,插件或者父项目引用和另外一个项目关联的时候,Maven通过坐标来精确定位一个项目。
坐标的格式为groupId:artifactId:packaging:version 例如 junit:junit:jar:3.8.1
groupId 以创建这个项目的组织名称的逆向域名(reverse domain name)开头。例如Apache Software的项目有以 org.apache开头的groupId。
artifactId 在groupId下的表示一个单独项目的唯一标识符。
version 一个项目的特定版本。发布的项目有一个固定的版本标识来指向该项目的某一个 特定的版本。而正在开发中的项目可以用一个特殊的标识,这种标识给版本加上 一个“SNAPSHOT”的标记。
packaging 项目的类型,默认是jar,描述了项目打包后的输出。类型为jar的项目产生一个 JAR文件,类型为war的项目产生一个web应用。
项目的打包格式也是Maven坐标的重要组成部分,但是它不是项目唯一标识符的一个部 分。一个项目的groupId:artifactId:version使之成为一个独一无二的项目;你不能同时有一个拥有同样的groupId, artifactId和version标识的项目。
4)Maven仓库(Repositories)
当第一次运行插件与目标时,将会从远程仓库去下载最新版本的插件。在Maven中,构件和插件是在它们被需要的时候从远程的仓库取来的。Maven自带了一个用来下载Maven核心插件和依赖的远程仓库地址(http://repo1.maven.org/maven2)
Maven从远程仓库下载构件和插件到你本机上,存储在你的本地Maven仓库里。一旦 Maven已经从远程仓库下载了一个构件,它将永远不需要再下载一次,因为maven会首 先在本地仓库查找插件,然后才是其它地方。Maven本地仓库既是一个从远程仓库下载的构件的缓存,也允许你的项目相互依赖。
5)Maven依赖管理 (Dependency Management)
dependencies
一个复杂的项目将会包含很多依赖,也有可能包含依赖于其它构件的依赖。这是Maven 最强大的特征之一,它支持了传递性依赖(transitive dependencies)。假如你 的项目依赖于一个库,而这个库又依赖于五个或者十个其它的库(就像Spring或者 Hibernate那样)。你不必找出所有这些依赖然后把它们写在你的pom.xml里,你只需 要加上你直接依赖的那些库,Maven会隐式的把这些库间接依赖的库也加入到你的项目中。Maven也会处理这些依赖中的冲突,同时能让你自定义默认行为,或者排除一些特定的传递性依赖。
scope
compile(编译范围)。compile是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在所有的classpath中可用,同时它们也会被打包。
provided(已提供范围) provided依赖只有在当JDK或者一个容器已提供该依赖之后才使用。例如,如果你开发了一个web应用,你可能在编译classpath中需要可用的Servlet API来编译一个servlet,但是你不会想要在打包好的WAR中包含这个Servlet API;这个Servlet API JAR由你的应用服务器或者servlet容器提供。已提供范围的依赖在编译classpath(不是运行时)可用。它们不是传递性的,也不会被打包。
runtime(运行时范围)runtime依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如,你可能在编译的时候只需要JDBC API JAR,而只有在运行的时候才需要JDBC驱动实现。
test(测试范围)test范围依赖在一般的 编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。
system(系统范围)system范围依赖与provided类似,但是你必须显式的提供一个对于本地系统中JAR文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。这样的构件应该是一直可用的,Maven也不会在仓库中去寻找它。如果你将一个依赖范围设置成系统范围,你必须同时提供一个systemPath元素。注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的Maven仓库中引用依赖)。
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。
6)站点生成和报告 (Site Generation and Reporting)
mvn site 这将会运行site生命周期阶段,你将会在target/site目录下看到一个项目web站点。载 入target/site/index.html你会看到项目站点的基本外貌。它包含了一些报告,它们在 左手边的导航目录的“项目报告”下面。它也包含了项目相关的信息,依赖和相关开发 人员信息,在“项目信息”下面。