1. Maven定义
Maven是一个项目管理工具,它包含了一个项目对象模型(POM)、一组标准集合、一个项目生命周期、一个依
赖管理系统;以及用来运行定义在生命周期阶段中插件(plugin)的目标(goal)的逻辑;主要服务于基于Java平
台的项目构建、依赖管理和项目信息管。
2. 基于项目定义的模型的特征
2.1 依赖管理
由于项目是根据一个包含组标识符,构件标识符和版本号的唯一的坐标定义的。项目间可以使用这些坐标来声明
依赖。
2.2 远程仓库
和项目依赖相关的,我们可以使用定义在项目对象模型(POM)中的坐标来创建Maven 构件的仓库。
2.3 全局性构建逻辑重用
插件被编写成和项目模型对象(POM)一起工作,它们没有被设计成操作某一个已知位置的特定文件。一切都
被抽象到模型中,插件配置和自定义行为都在模型中进行。
2.4 工具可移植性/集成
像 Eclipse,NetBeans,和 InteliJ 这样的工具现在有共同的地方来找到项目的信息。在 Maven 出现之前,
每个 IDE 都有不同的方法来存储实际上是自定义项目对象模型(POM)的信息。Maven 标准化了这种描述,而
虽 然每个 IDE 仍然继续维护它的自定义项目文件,但这些文件现在可以很容易的由模型生成。
2.5 便于搜索和过滤构件
像 Nexus 这样的工具允许你使用存储在 POM 中的信息对仓库中的内容进行索引和搜索。
3. Maven与Ant的区别
Ant(Another Neat Tool,另一个整洁的工具):基于任务和依赖的构建系统,是自定义的程序化构建,是过程式的。
• Ant 没有正式的约定如一个一般项目的目录结构,你必须明确的告诉 Ant 哪里去找源代码,哪里放置输出。随
着时间的推移,非正式的约定出现了,但是它们还没有在产品中模式化。
• Ant 是程序化的,你必须明确的告诉 Ant 做什么,什么时候做。你必须告诉它去编译,然后复制,然后压缩。
• Ant 没有生命周期,你必须定义目标和目标之间的依赖。你必须手工为每个目标附上一个任务序列。
Maven: 采用了约定由于配置的(Convention over Configuration)的思想,是声明式的。
• Maven 拥有约定,因为你遵循了约定,它已经知道你的源代码在哪里。它把字节码放到 target/classes ,然
后在 target 生成一个 JAR 文件。
• Maven 是声明式的。你需要做的只是创建一个 pom.xml 文件然后将源代码放到默认的目录。Maven 会帮你处
理其它的事情。
• Maven 有一个生命周期,当你运行 mvn install 的时被调用。这条命令告诉 Maven 执行一系列的有序的步骤,
直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven 运行了许多默认的插件目标,这些目
标完成了像编译和创建一个 JAR 文件这样的工作。
4. Maven核心概念
4.1 Maven的插件和目标(Plugins and Goals)
以上述Quickstart Archetype为例,create为目标;一个Maven插件是一个单个或者多个目标的集合。
一个目标是一个明确的任务,它可以作为单独的目标运行,或者作为一个大的构建的一部分和其它目标一起运行。
一个目标是Maven中的一个“工作单元(unit of work)”。目标的例子包括Compiler插件中的compile目标,它
用来编译项目中的所有源文件,或者Surefire插件中的test目标,用来运行单元测试。通过-D传入参数,如
packageName参数,不穿该参数,将默认采用groupId作为包名。
4.2 Maven生命周期(Lifecycle)
生命周期是包含在一个项目构建中的一系列有序的阶段。
Maven可以支持许多不同的生命周期,但是最常用的生命周期是默认的Maven生命周期,这个生命周期中一开
始的一个阶段是验证项目的基本完整性,最后的一个阶段是把一个项目发布成产品。 插件目标可以附着在生命周
期阶段上。随着Maven沿着生命周期的阶段移动,它会执行附着在特定阶段上的目标。每个阶段可能绑定了零个
或者多个目标。
以运行mvn package命令为例,当Maven经过以package为结尾的默认生命周期的时候,下面的目标按顺序
被执行:
(1)resources:resources
Resources插件的resources目标绑定到了resources 阶段。这个目标复制src/main/resources下的所有资
源和其它任何配置的资源目录,到输出目录。
(2)compiler:compile
Compiler插件的compile目标绑定到了compile 阶段。这个目标编译src/main/java下的所有源代码和其他任
何配置的资源目录,到输出目录。
(3)resources:testResources
Resources插件的testResources目标绑定到了test-resources 阶段。这个目标复制src/test/resources
下的所有资源和其它任何的配置的测试资源目录,到测试输出目录。
(4)compiler:testCompile
Compiler插件的testCompile目标绑定到了test-compile 阶段。这个目标编译src/test/java下的测试用例和
其它任何的配置的测试资源目录,到测试输出目录。
(5)surefire:test
Surefire插件的test目标绑定到了test 阶段。这个目标运行所有的测试并且创建那些捕捉详细测试结果的输出
文件。默认情况下,如果有测试失败,这个目标会终止。
(6)jar:jar
Jar插件的jar目标绑定到了package 阶段。这个目标把输出目录打包成JAR文件。
4.3 Maven坐标(Coordinates)
Maven项目坐标:groupId:artifactId:packaging:version:(classifie)
classifie为可选的。
项目唯一标识符:groupId:artifactId:version。
4.4 Maven仓库(Repositories))
下载Maven核心插件和依赖的远程仓库地址:http://repo1.maven.org/maven2.
Maven仓库存储构件的目录格式是:
/<groupId>/<artifactId>/<version>/<artifactId>-<version>.<packaging>
4.5 Maven依赖管理((Dependency Management)
Maven支持传递性依赖。
4.6 站点生成和报告(Site Generating and Reporting)
命令:mvn site
5. Maven目录分析
bin:包含mvn 运行的脚本;
boot: mvn 的类加载器框架;
conf: 用与定制mvn的行为,包含settings.xml文件;
lib: 包含Maven运行时需要的Java类库。
6. 配置HTTP代理
在settings.xml文件中,配置代理主机:192.168.1.106,端口:8888:
<proxy>
<id>optional</id>
<active>true</active>
<protocol>http</protocol>
<username>proxyuser</username>
<password>proxypass</password>
<host>192.168.1.106</host>
<port>8888</port>
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>
其中<active>为True指激活该代理,<nonProxyHosts>指不需要代理的网站。