1.maven definition
a. a build tool (like ANT)
b. a dependency management system
c. plugin
d. environment-specific configuration
e. reports
2.Conventions over configuration,比如“目录”就有一系列默认值:
a.source code is assumed to be in ${basedir}/src/main/java
b.resources are assumed to be in ${basedir}/src/main/resources
c.Tests are assumed to be in ${basedir}/src/test
d.compile byte code to ${basedir}/target/classes
e.create a distributable JAR file in ${basedir}/target
3. Maven is not just another build tool. It’s a common interface for project builds (the core reason why it has succeeded)
a. 你所有的project及它们的依赖都可由maven来组织
b. 用简单的maven指令来组织所有相关项目("mvn install" instead of "找到A所依赖的project以及这些project所依赖的project, 用浏览器下载,纳入项目路径")
4. Maven本身很弱,它的功能都依赖Maven Plugins,编译、打包、发布都是Maven Plugin干的. Maven is more of a platform than a tool
5. Project Object Model(POM): Project规格说明书,正是基于这些规格(如ID,版本,依赖关系等),"mvn install"才成为可能
6. Maven的配置文件:pom.xml
a.阐述配置,而不是布置任务(与Ant相反)
b.不限于java项目
c.pom可以有父子关系. parent-pom定义了一些默认的东西让子pom继承
d.最顶层的pom.xml即super-pom,在maven-3.0.3-uber.jar里
e."mvn help:effective-pom" 可以看"Effective POMs" –after inheritance, interpolation(变量替换成值), and profiles are applied
7.SNAPSHOT版本:代表正在开发、不稳定的版本。Project应该避免依赖SNAPSHOT版本,MAVEN默认不支持对SNAPSHOT的依赖。
8.Dependency的几种Scope: compile(编译、执行都用), provided(只用于编译), runtime(只用于执行,不用于编译),test,system(依赖本地Project,较少用)
9.比较牛逼的一点是:如果你的project依赖了Spring, 则只需要声明对Spring的依赖;Maven可以自动帮你搞定Spring对别的project的依赖。
10.Project三要素:
a.groupId(project所属组,如org.springframework)
b.artifactId(project 的main identifier,如 spring. group下的artifact不能重复)
c.version
其实还有一个不太常用的,classifier, 用于两个project的groupId + artifactId + version相同,但应用平台不一样的情况(比如一个用于java 1.4,一个用于1.5)
11.你会常常用到POM的父子关系: "If you start using Maven to manage and build large multi-module projects, you will often be creating many projects which share a common groupId and version."
======================================================================
1. Build Lifecycle: 一个life cycle由一系列Phase组成,每个Phase可以绑定plugin提供的Goal(相当于ant里的task)
以Clean Lifecycle为例,它包含三个Phase:
a.pre-clean
b.clean
c.post-clean
命令"mvn clean:clan" 调用clean插件的clean goal
命令"mvn clean" 则执行clean这个life cycle
2.mvn package 是什么意思? 由于并没有package这个lifecycle,maven会试图从"default"这个lifecycle里去找package这个phase; 查找发现,此乃default lifecycle的最后一个phase,于是maven就会从default lifecycle的第一个phase开始执行,直到package
3.package有好几种类型,"mvn package"会根据package的不同类型执行不同的操作; web程序一般用war类型,pom.xml: <packaging>war</packaging>
4.mvn install: 把artifact部署到本地repository,如"copy the JAR file from target/simple-test-1.0.2.jar to ~/.m2/repository/org/sonatype/mavenbook/simple-test/1.0.2/simple-test-1.0.2.jar."
5.mvn deploy: deploy an artifact to a remote Maven repository
=============================================
Env-Specific 问题:不同环境可以有不同的build方式,这个方式被称作Profile. 你可以在pom.xml里定义一个profile<profile id="production">…, 然后执行时 mvn pakcage -Pproduction
有时间实践一下如何用Maven解决多Project(hint: sub-module)、多环境、多版本的开发问题
=============================================
可以为项目生成一个类似http://maven.apache.org的站点
step #1.mvn archetype:create -DgroupId=player.kent -DartifactId=KentSite
step #2.mvn site:run
step #3.用浏览器打开http://localhost:8080
Archetype Plugin: 用于生成指定类型的Project Scheleton,公司可以强制使用这个东西来生成Project,以实现Project风格的统一
要生成webapp,可以用maven-archetype-webapp 这个archetype
另有一些第三方archetype, 如appfuse-modular-spring:
$ mvn archetype:generate \
-DarchetypeArtifactId=appfuse-modular-spring \
-DarchetypeGroupId=org.appfuse.archetypes \
-DgroupId=org.sonatype.mavenbook \
-DartifactId=mod-spring \
-Dversion=1.0-SNAPSHOT \
你还可以生成自己公司特有的archetype