mvn compile exec:java -Dexec.mainClass=com.xxx.yyy.zzz.Main 编译并运行Main
mvn dependency:tree 查看mvn包依赖树
mvn dependency:tree | grep --context=5 guava 查看mvn包依赖树, 并管道过滤
Maven简介 (免费试读)
1.1 何为Maven
1.2 为什么需要Maven
1.3 Maven与极限编程
1.4 被误解的Maven
Maven安装 (免费试读) (免费迷你版)
2.1 在Windows上安装Maven
2.2 在基于Unix的系统上安装Maven
2.3 安装目录分析
2.4 设置HTTP代理
2.5 安装m2eclipse
2.6 安装NetBeans Maven插件
2.7 Maven安装最佳实践
Hello World (免费试读) (免费迷你版)
3.1 编写POM P47
POM(Project Object Model,项目对象模型)
3.2 编写主代码
3.3 编写测试代码
3.4 打包和运行
3.5 使用Archetype生成项目骨架
3.6 m2eclipse简单使用
3.7 NetBeans Maven插件简单使用
背景案例 P64 -------------------
4.1 简单的账户注册服务
4.2 需求阐述
4.3 简要设计
4.3.1 接口
4.3.2
5 坐标和依赖 P70
Maven的一大功能是管理项目依赖。为了能自动化地解析任何一个Java构件,Maven就必须将他们唯一标识,这就依赖管理的底层基础----坐标。
5.1 何为Maven坐标
坐标(Coordinate)
Maven定义了一些规则:世界上任何一个构件都可以使用Maven坐标唯一标识,Maven坐标的元素包括groupId、artifactId、version、packaging、classifier.
Maven内置了一个中央仓库的地址: http://repo1.maven.org/maven2
5.2 坐标详解
项目构件的文件名是与坐标向对应的,一般的规则为artifactId-version [-classifier].packaging, [-classifier]表示可选。
如:nexus-indexer的主构件为nexus-indexer-2.0.0.jar,附属构件有nexus-indexer-2.0.0-javadoc.jar
5.3 account-email
5.4 依赖的配置
<project>
...
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<type>jar/</type>
<scope>compile/test/provided/runtime/system/import</scope>
<optional>...</optional>
<exclusions>
<exclusion>
...
</exclusion>
</exclusions>
</dependency>
</dependencise>
...
</project>
5.5 依赖范围
5.6 传递性依赖
5.7 依赖调解
5.8 可选依赖
5.9 最佳实践
6 仓库 P94
6.1 何为Maven仓库
6.2 仓库的布局
6.3 仓库的分类
仓库分为:本地仓库 和 远程仓库
中央仓库是Maven核心自带的远程仓库,它包含了绝大部分开源的构件。在默认配置下,当本地仓库没有Maven需要的构件的时候,它就会尝试从中央仓库下载。
私服是另一种特殊的远程仓库,为了节省带宽和时间,应该在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库。内部的项目还能部署到私服上供其他项目使用。
常见的公开的远程仓库有:Java.net Maven库( http://download.java.net/maven/2)
和JBoss Maven库( http://repository.jboss.com/maven2/)
6.4 远程仓库的配置
6.5 快照版本
6.6 从仓库解析依赖的机制
6.7 镜像
6.8 仓库搜索服务
6.8.1 Sonatype Nexus: http://repository.sonatype.org
6.8.2 Jarvana http://www.jarvana.com/jarvana/
6.8.3 MVNbrowser http://www.mvnbrowser.com
6.8.4 MVNrepository http://mvnrepository.com/
6.8.5 选择合适的仓库搜素服务:
主流的Maven公共仓库:central、JBoss、Java.net
7 生命周期和插件 P114
7.1 何为生命周期
生命周期包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有构建步骤。
Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,在Maven的设计中,实际的任务(如编译源代码)都交由插件来完成。这种思想与设计模式中的模板方法(Template Method)非常相似。模板方法模式在父类中定义了算法的整体结构,子类可以通过实现或者重写父类的方法来控制实际的行为,这样既保证了算法有足够的可扩展性,有能够严格控制算法的整体结构。
public abstract class AbstractBuild {
public void build() {
initialize();
compile();
test();
packagee();
integrationTest();
deploy();
}
protected abstract void initialize();
protected abstract void compile();
protected abstract void test();
protected abstract void packagee();
protected abstract void integrationTest();
protected abstract void deploy();
}
默认插件:
针对编译的插件有:maven-compiler-plugin
针对测试的插件有: maven-surefire-plugin
7.2 生命周期详解
7.2.1 三套生命周期
Maven拥有三套相互独立的生命周期,它们分别为clean、default和site。
clean生命周期的目的是清理项目,default生命周期的目的是构建项目,而site生命周期的目的是建立项目站点。
7.2.2 clean生命周期
clean生命周期的目的是清理项目,它包含三个阶段:
1) pre-clean执行一些清理前需要完成的工作。
2)clean 清理上一次构建生成的文件。
3)post-clean执行一些清理后需要完成的工作。
7.2.3 default生命周期
default生命周期定义了真正构建时所需要执行的所有步骤,它是所有生命周期中最核心的部分,其包含的阶段如下,
validate
initialize
generate-sources
process-sources处理项目主资源文件。
generate-resources
process-resources
compile编译项目的主源码。一般来说,是编译src/main/java目录下的Java文件至项目输出的主classpath目录中。
process-classes
generate-test-sources
process-test-sources 处理项目测试资源文件。
test-compile编译项目的测试代码。一般来说,是编译src/test/java目下的Java文件至项目输出的测试classpath目录中。
process-test-classes
test 使用单元测试框架运行测试,测试代码不会被打包或部署。
prepare-package
package接受编译好的代码,打包成可发布的格式。如JAR.
pre-integeration-test
integration-test
post-integration-test
verify
install将包安装到Maven本地仓库,供本地其他Maven项目使用。
deploy将最终的包复制到远程仓库,工其他开发人员和Maven项目使用。
官方解释: http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
7.2.4 site生命周期
site生命周期的目的是建立和发布项目站点,Maven能够基于POM所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目
该生命周期包含如下阶段:
pre-site执行一些在生成项目站点之前需要完成的工作
site生成项目站点文档
post-site执行一些在生成项目站点之后需要完成的工作。
site-deploy将生成的项目站点发布到服务器上。
7.2.5 命令行与生命周期:
从命令行执行Maven任务的最主要方式就是调用Maven的生命周期阶段。
$mvn clean:该命令调用clean生命周期的clean阶段。实际执行的阶段为clean生命周期的pre-clean和clean阶段。
$mvn test:该命令调用default生命周期的test阶段。实际执行的阶段为default生命周期的validate、initialize等,直到test的所有阶段。这也解释了为什么在执行测试的时候,项目的代码能够自动得以编译。
$mvn clean install
$mvn clean deploy site-deploy 的最后一个阶段,site-deploy为site生命周期的最后一个阶段。
7.3 插件目标 ============P118
maven-dependency-plugin有十多个目标,每个目标对应了一个功能: 对应的插件目标为:dependency:analyze、dependency:tree和dependency:list.
这是一种通用的写法,冒号前面是插件前缀,冒号后面是该插件的目标。
如:compiler:compile(这是maven-compiler-plugin的compile目标)和surefire:test(这是maven-surefire-plugin的test目标)
default生命周期与插件目标的绑定关系Maven官方文档: http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Built-in_Lifecycle_Bindings
7.4 插件绑定
7.5 插件配置
==================P123
7.6 获取插件信息
官方插件: http://repo1.maven.org/maven2/org/apache/maven/plugins/
7.7 从命令行调用插件
7.8 插件解析机制
聚合与继承
8.1 account-persist
8.2 聚合
8.3 继承
8.4 聚合与继承的关系
8.5 约定优于配置
8.6 反应堆
使用 Nexus 创建私服
管理员用户名和密码:admin/admin123
9.1 Nexus简介
9.2 安装Nexus
9.3 Nexus的仓库与仓库组
Nexus包含各种类型的仓库概念,包括: group(仓库组)、hosted(宿主仓库)、proxy(代理仓库)、virtual(虚拟)
仓库还有一个属性为Policy(策略),表示该仓库为发布(Release)版本仓库还是快照(Snapshot)版本仓库。
Nexus仓库包括:
Maven Central:该仓库代理Maven中央仓库,其策略为Release,因此只会下载和缓存中央仓库中的发布版本构件。
Releases:这是一个策略为Release的宿主类型仓库,用来部署组织内部的发布版本构件。
Snapshots:这是一个策略为Snapshot的宿主类型仓库,用来部署组织内部的快照版本构件。
3rd party:这是一个策略为Release的宿主类型仓库,用来部署无法从公共仓库获得的第三方发布版本构件。
Apache Snapshots:这是一个策略为Snapshot的代理仓库,用来代理Apache Maven仓库的快照版本构件。
Codehaus Snapshots:这是一个策略为Snapshot的代理仓库,用来代理Codehaus Maven仓库的快照版本构件。
Google Code:这是一个策略为Release的代理仓库,用来代理Google Code Maven仓库的发布版本构件。
java.net -Maven2:这是一个策略为Release的代理仓库,用来代理java.net Maven仓库的发布版本构件。
Public Repositories:该仓库组将上述所有策略为Release的仓库聚合并通过一致的地址提供服务。
9.4 Nexus的索引与构件搜索
Nexus通过维护仓库的索引来提供搜索功能,能在很大程度上方面Maven用户定位构件坐标。
Nexus能够遍历一个Maven仓库所有的内容,搜集它们的坐标、校验和及所含的Java类信息,然后以nexus-indexer的形式保存起来。
中央仓库维护了这样一个nexus-indexer,因此本地的Nexus下载到这个索引之后,就能在此基础上提供搜索和浏览等服务。
对于宿主仓库来说,ReIndex任务会扫描该仓库包含的所有构件建立索引。
对于代理仓库来说,ReIndex任务会扫描所有缓存的构件建立索引,如果远程仓库也有索引,则下载后与本地的索引合并。
对于仓库组来说,ReIndex任务会合并其包含的所有仓库的索引。
9.5 配置Maven从Nexus下载构件
9.6 部署构件至Nexus
9.7 Nexus的权限管理
9.8 Nexus的调度任务
9.9 其他私服软件
使用 Maven 进行测试
10.1 account-captcha
10.2 maven-surefire-plugin简介
10.3 跳过测试
10.4 动态指定要运行的测试用例
10.5 包含与排除测试用例
10.6 测试报告
10.7 运行TestNG测试
10.8 重用测试代码
Junit
TestNG(Next Generation Java Testing)
Cobertura开源测试覆盖率统计工具
使用 Hudson 进行持续集成
Hudson是最流行的开源持续集成服务器软件
11.1 持续集成的作用、过程和优势
11.2 Hudson简介
持续集成工具:开源工具CruiseControl、商业的Bamboo和TeamCity、Hudson等
11.3 安装Hudson
11.4 准备Subversion仓库
11.5 Hudson的基本系统设置
11.6 创建Hudson任务
11.7 监视Hudson任务状态
11.8 Hudson用户管理
11.9 邮件反馈
11.10 Hudson工作目录
构建 Web 应用
12.1 Web项目的基本结构
12.2 account-service
12.3 account-web
12.4 使用jetty-maven-plugin进行测试
12.5 使用Cargo实现自动化部署
版本管理
版本管理(Version Management):指项目整体版本的演变过程管理。
版本控制(Version Control):指接入版本控制工具(如Subversion)追踪代码的每一个变更。
13.1 何为版本管理
13.2 Maven的版本号定义约定
13.3 主干、标签与分支
版本管理:
1 主干:项目开发代码的主体,是从项目开始直到当前都处于活动的状态。从这里可以获得项目最新的源代码以及几乎所有的变更历史。
2 分支:从主干的某个点分离出来的代码拷贝,通常可以在不影响主干的前提下载这里进行重大Bug的修复,或者做一些实验性质的开发。如果分支达到了预期的目的,通常发生在这里的变更会被合并(merge)到主干中。
3 标签:用来便是主干或者分支的某个点的状态,一代表项目的某个稳定状态,这通常就是版本发布时的状态。
13.4 自动化版本发布
13.5 自动化创建分支
13.6 GPG签名
灵活的构建
14.1 Maven属性
14.2 构建环境的差异
14.3 资源过滤
14.4 Maven Profile
14.5 Web资源过滤
14.6 在Profile中激活集成测试
生成项目站点
15.1 最简单的站点
15.2 丰富项目信息
15.3 项目报告插件
15.4 自定义站点外观
15.5 创建自定义页面
15.6 国际化
15.7 部署站点
m2eclipse
16.1 m2eclipse简介
16.2 安装m2eclipse
16.3 新建Maven项目
16.4 导入Maven项目
16.5 执行mvn命令
16.6 访问Maven仓库
16.7 管理项目依赖
16.8 其它实用功能
编写 Maven 插件
17.1 编写Maven插件的一般步骤
17.2 代码行统计Maven插件
17.3 Mojo标注
17.4 Mojo参数
17.5 错误处理和日志
17.6 测试Maven插件
Archetype
18.1 Archetype使用再叙
18.2 编写Archetype
18.3 Archetype Catalog