Maven的散乱笔记

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

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.