maven(平台组内部分享一)

一。安装

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你会看到项目站点的基本外貌。它包含了一些报告,它们在 左手边的导航目录的“项目报告”下面。它也包含了项目相关的信息,依赖和相关开发 人员信息,在“项目信息”下面。

你可能感兴趣的:(maven(平台组内部分享一))