《Maven权威指南》学习笔记1

来源:互联网 发布:windows故障转移集群 编辑:程序博客网 时间:2024/06/10 08:28

    经过了二十天的学习,留下了二十篇的JUnit学习笔记,通过思考,虽然是将JUnit in Action的1~11章(12章为EJB测试)详细的看了一遍,但是还没有直接转化成代码,原因在于书中介绍了多种方法和多种测试模型,对Ant和Maven的讲解乃至是二者的对比和开发的流程还不详尽。所以,考虑了Maven更加的先进,所以,选了一本书继续的学习。

 

-------------------------------------------------------------本书介绍-----------------------------------------------------------------

   

             http://books.sonatype.com/maven-book/reference_zh/web.html

 

          Maven权威指南

             Authors

Tim O'Brien (Sonatype, Inc.) , John Casey (Sonatype, Inc.) , Brian Fox (Sonatype, Inc.) , Bruce Snyder () , Jason Van Zyl (Sonatype, Inc.) , Juven Xu ()

Abstract

Maven权威指南是一本关于Apache Maven的书。

-------------------------------------------------------------切入正题-----------------------------------------------------------------

本书1-2章是在Ant和Maven的对比中,阐明了二者的优缺,而Maven的优势是显然的,所以在第三章对Maven进行了解析。方法是根据一个初级的例子。

           

             3.1. 简介

本章我们介绍一个用Maven Archetype插件从空白开始创建的简单项目。当你跟着这个简单项目的开发过程,你会看到这个简单的应用给我们提供了介绍Maven核心概念的机会。

在 你能开始使用Maven做复杂的,多模块的构建之前,我们需要从基础开始。如果你之前用过Maven,你将会注意到这里很好的照顾到了细节。你的构建倾向于“只要能工作”,只有当你需要编写插件来自定义默认行为的时候,才需要深入Maven的细节。另一方面,当你需要深入Maven细节的时候,对 Maven核心概念的彻底理解是至关重要的。本章致力于为你介绍一个尽可能简单的Maven项目,然后介绍一些使Maven成为一个可靠的构建平台的核心概念。读完本章后,你将会对构建生命周期 (build lifecycle)Maven仓库 (repositories),依赖管理 (dependency management)和项目对象模型 (Project Object Model)有一个基本的理解。

                        3.1.1. 下载本章的例子

本章开发了一个十分简单的例子,它将被用来探究Maven的核心概念。如果你跟着本章表述的步骤,你应该不需要下载这些例子来重新创建那些Maven已经生成好的代码。我们将会使用Maven Archetype插件来创建这个简单的项目,本章不会以任何方式修改这个项目。如果你更喜欢通过最终的例子源代码来阅读本章,本章的例子项目和这本书的例子代码可以从这里下载到:http://www.sonatype.com/book/mvn-examples-1.0.zip或者http://www.sonatype.com/book/mvn-examples-1.0.tar.gz。解压存档文件到任何目录下,然后到ch03/目录。在ch03/目录你将看到一个名字为simple/的目录,它包含了本章的源代码。如果你希望在Web浏览器里看这些例子代码,访问http://www.sonatype.com/book/examples-1.0并且点击ch03/目录。

             3.2. 创建一个简单的项目

开始一个新的Maven项目,在命令行使用Maven Archetype插件。

$ mvn archetype:create -DgroupId=org.sonatype.mavenbook.ch03 /

                                         -DartifactId=simple /

                                         -DpackageName=org.sonatype.mavenbook

[INFO] Scanning for projects...

[INFO] Searching repository for plugin with prefix: 'archetype'.               

[INFO] artifact org.apache.maven.plugins:maven-archetype-plugin: checking for /

       updates from central

[INFO] -----------------------------------------------------------------------

[INFO] Building Maven Default Project

[INFO]    task-segment: [archetype:create] (aggregator-style)

[INFO] --------------------------------------------------------------------

[INFO] [archetype:create]

[INFO] artifact org.apache.maven.archetypes:maven-archetype-quickstart: /

       checking for updates from central

[INFO] Parameter: groupId, Value: org.sonatype.mavenbook.ch03

[INFO] Parameter: packageName, Value: org.sonatype.mavenbook

[INFO] Parameter: basedir, Value: /Users/tobrien/svnw/sonatype/examples

[INFO] Parameter: package, Value: org.sonatype.mavenbook

[INFO] Parameter: version, Value: 1.0-SNAPSHOT

[INFO] Parameter: artifactId, Value: simple

[INFO] * End of debug info from resources from generated POM *

[INFO] Archetype created in dir: /Users/tobrien/svnw/sonatype/examples/simple

mvn Maven2的命令。archetype:create称为一个Maven目标 (goal)。如果你熟悉Apache Ant,一个Maven目标类似于一个Ant目标 (target);它们都描述了将会在构建中完成的工作单元 (unit of work)。而像-Dname=value这样的对是将会被传到目标中的参数,它们使用-D属性这样的形式[1],类似于你通过命令行向Java虚拟机传递系统属性。archetype:create这 个目标的目的通过archetype快速创建一个项目。在这里,一个archetype被定义为“一个原始的模型或者类型,在它之后其它类似的东西与之匹 配;一个原型(prototype)”Maven有许多可用的archetype,从生成一个简单的Swing应用,到一个复杂的Web应用。本章我们 用最基本的archetype来创建一个入门项目的骨架。这个插件的前缀是“archetype”,目标为”create”[1]

我们已经生成了一个项目,看一下Mavensimple目录下创建的目录结构:

simple/

simple/pom.xml

      /src/

      /src/main/

          /main/java

      /src/test/

          /test/java

这个生成的目录遵循Maven标准目录布局,我们之后会去看更多的细节,但是,现在让我们只是尝试了解这些基本的目录。

 

Maven Archtype插件创建了一个与artifactId匹配的目录——simple。这是项目的基础目录。

 

每个项目在文件pom.xml里有它的项目对象模型 (POM)。这个文件描述了这个项目,配置了插件,声明了依赖。

 

我们项目的源码了资源文件被放在了src/main目录下面。在我们简单Java项目这样的情况下,这个目录包含了一下java类和一些配置文件。在其它的项目中,它可能是web应用的文档根目录,或者还放一些应用服务器的配置文件。在一个Java项目中,Java类放在src/main/java下面,而classpath资源文件放在src/main/resources下面。

 

我们项目的测试用例放在src/test下。在这个目录下面,src/test/java存放像使用JUnit或者TestNG这样的Java测试类。目录src/test/resources下存放测试classpath资源文件。

Maven Archtype插件生成了一个简单的类org.sonatype.mavenbook.App,它是一个仅有13行代码的Java,所做的只是在main方法中输出一行消息:

package org.sonatype.mavenbook;

 

/**

 * Hello world!

 *

 */

public class App

{

    public static void main( String[] args )

    {

        System.out.println( "Hello World!" );

    }

}

最简单的Maven archetype生成最简单的Maven项目:一个往标准输出打印“Hello World”的程序。

             3.3. 构建一个简单的项目

一旦你遵循Section 3.2, “创建一个简单的项目”使用Maven Archetype插件创建了一个项目,你会希望构建并打包这个应用。想要构建打包这个应用,在包含pom.xml的目录下运行mvn install

$ mvn install

[INFO] Scanning for projects...

[INFO] ----------------------------------------------------------------------------

[INFO] Building simple

[INFO]    task-segment: [install]

[INFO] ----------------------------------------------------------------------------

[INFO] [resources:resources]

[INFO] Using default encoding to copy filtered resources.

[INFO] [compiler:compile]

[INFO] Compiling 1 source file to /simple/target/classes

[INFO] [resources:testResources]

[INFO] Using default encoding to copy filtered resources.

[INFO] [compiler:testCompile]

[INFO] Compiling 1 source file to /simple/target/test-classes

[INFO] [surefire:test]

[INFO] Surefire report directory: /simple/target/surefire-reports

 

-------------------------------------------------------

 T E S T S

-------------------------------------------------------

Running org.sonatype.mavenbook.AppTest

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.105 sec

 

Results :

 

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

 

[INFO] [jar:jar]

[INFO] Building jar: /simple/target/simple-1.0-SNAPSHOT.jar

[INFO] [install:install]

[INFO] Installing /simple/target/simple-1.0-SNAPSHOT.jar to /

  ~/.m2/repository/org/sonatype/mavenbook/ch03/simple/1.0-SNAPSHOT/ /

  simple-1.0-SNAPSHOT.jar

你已经创建了,编译了,测试了,打包了,并且安装了(installed)最简单的Maven项目。在命令行运行它以向你自己验证这个程序能工作。

$ java -cp target/simple-1.0-SNAPSHOT.jar org.sonatype.mavenbook.App

Hello World!

             3.4. 简单的项目对象模型 (Project Object Model)

Maven运行的时候它向项目对象模型(POM)查看关于这个项目的信息。POM回答类似这样的问题:这个项目是什么类型的?这个项目的名称是什么?这个项目的构建有自定义么?这里是一个由Maven Archetype插件的create目标创建的默认的pom.xml文件。

Example 3.1. Simple 项目的 pom.xml 文件

<project xmlns="http://maven.apache.org/POM/4.0.0"

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>org.sonatype.mavenbook.ch03</groupId>

  <artifactId>simple</artifactId>

  <packaging>jar</packaging>

  <version>1.0-SNAPSHOT</version>

  <name>simple</name>

  <url>http://maven.apache.org</url>

  <dependencies>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>3.8.1</version>

      <scope>test</scope>

    </dependency>

  </dependencies>

</project>

 

这个pom.xml文件是你将会面对的Maven项目中最基础的POM,一般来说一个POM文件会复杂得多:定义多个依赖,自定义插件行为。最开始的几个元素——groupIdartifactId, packaging, version——Maven的坐标(coordinates),它们唯一标识了一个项目。nameurlPOM提供的描述性元素,它们给人提供了可阅读的名字,将一个项目关联到了项目web站点。最后,dependencies元素定义了一个单独的,测试范围(testscoped)依赖,依赖于称为JUnit的单元测试框架。这些话题将会Section 3.5, “核心概念”被深入介绍,当前,你所需知道的是,pom.xml是一个让Maven跑起来的文件。

Maven运行的时候,它是根据项目的pom.xml里设置的组合来运行的,一个最上级的POM定义了Maven的安装目录,在这个目录中全局的默认值被定义了,(可能)还有一些用户定义的设置。想要看这个“有效的 (effective)”POM,或者说Maven真正运行根据的POM,在simple项目的基础目录下跑下面的命令。

$ mvn help:effective-pom

一旦你运行了此命令,你应该能看到一个大得多的POM,它暴露了Maven的默认设置

             3.5. 核心概念

我们已经第一次运行了Maven,是时候介绍一些Maven的核心概念了。在之前的例子中,我们生了一个项目,它包含了一个POM和一些源代码,它们一起组成了Maven的标准目录布局。之后你用生命周期阶段(phase)作为参数来运行Maven,这个阶段会提示Maven运行一系列Maven插件的目标。最后,你把Maven构件(artifact)安装(install)到了你本地仓库(repository)。等等?什么是生命周期?什么是“本地仓库”?下面的小结阐述了一些Maven的核心概念。

                        3.5.1. Maven插件和目标 (Plugins and Goals)

在前面一节中,我们用两种类型的命令行参数运行了Maven。第一条命令是一条单个的插件目标,Archetype插件的create目标。Maven第二次运行是一个生命周期阶段 –install。为了运行单个的Maven插件目标,我们使用mvn archetype:create这样的语法,这里archetype是一个插件标识而create是目标标识。当Maven运行一个插件目标,它向标准输出打印出插件标识和目标标识:

$ mvn archetype:create -DgroupId=org.sonatype.mavenbook.ch03 /

                                        -DartifactId=simple /

                                        -DpackageName=org.sonatype.mavenbook

...

[INFO] [archetype:create]

[INFO] artifact org.apache.maven.archetypes:maven-archetype-quickstart: /

       checking for updates from central

...

一个Maven插件是一个单个或者多个目标的集合。Maven插件的例子有一些简单但核心的插件,像Jar插件,它包含了一组创建JAR文 件的目标,Compiler插件,它包含了一组编译源代码和测试代码的目标,或者Surefire插件,它包含一组运行单元测试和生成测试报告的目标。而 其它的,更有专门的插件包括:Hibernate3插件,用来集成流行的持久化框架HibernateJRuby插件,它让你能够让运行ruby称为 Maven构建的一部分或者用Ruby来编写Maven插件。Maven也提供了自定义插件的能力。一个定制的插件可以用Java编写,或者用一些其它的语言如AntGroovybeanshell和之前提到的Ruby

Figure 3.1. 一个插件包含一些目标

 

一个目标是一个明确的任务,它可以作为单独的目标运行,或者作为一个大的构建的一部分和其它目标一起运行。一个目标是Maven中的一个“工作单元(unit of work)”。目标的例子包括Compiler插件中的compile目标,它用来编译项目中的所有源文件,或者Surefire插件中的test目标,用来运行单元测试。目标通过配置属性进行配置,以用来定制行为。例如,Compiler插件的compile目标定义了一组配置参数,它们允许你设置目标JDK版本或者选择是否用编译优化。在之前的例子中,我们通过命令行参数-DgroupId=org.sonatype.mavenbook.ch03-DartifactId=simpleArchetype插件的create目标传入了groupIdartifactId配置参数。我们也向create目标传入了packageName参数,它的值为org.sonatype.mavenbook。如果我们忽略了packageName参数,那么包名的默认值为org.sonatype.mavenbook.ch03

Note

当提到一个插件目标的时候,我们常常用速记符号:pluginId:goalId。例如,当提到Archetype插件的create目标的时候,我们写成archetype:create

目标定义了一些参数,这些参数可以定义一些明智的默认值。在archetype:create这个例子中,我们并没有在命令行中指定这个目标创建什么类型的archetype,我们简单的传入一个groupId和一个artifactId。这是我们对于约定优于配置(convention over configuration)的第一笔。这里create目标的约定,或者默认值,是创建一个简单的项目,叫做Quickstartcreate目标定义了一个配置属性archetypeArtifactId,它有一个默认值为maven-archetype-quickstartQuickstart archetype生成了一个最小项目的躯壳,包括一个POM和一个类。Archetype插件比第一个例子中的样子强大得多,但是这是一个快速开始新项目的不错的方法。在本书的后面,我们将会让你看到Archetype插件可以用来生成复杂如web应用的项目,以及你如何能够使用Archetype插件来定义你自己项目的集合。

Maven的核心对你项目构建中特定的任务几乎毫无所知。就它本身来说,Maven不知道如何编译你的代码,它甚至不知道如何制作一个JAR文 件,它把所有这些任务代理给了Maven插件,像Compiler插件和Jar插件,它们在需要的时候被下载下来并且定时的从Maven中央仓库更新。当 你下载Maven的时候,你得到的是一个包含了基本躯壳的Maven核心,它知道如何解析命令行,管理classpath,解析POM文 件,在需要的时候下载Maven插件。通过保持Compiler插件和Maven核心分离,并且提供更新机制,用户很容易能使用编译器最新的版本。通过这 种方式,Maven插件提供了通用构建逻辑的全局重用性,有不会在构建周期中定义编译任务,有使用了所有Maven用户共享的Compiler插件。如果 有个对Compiler插件的改进,每个使用Maven的项目可以立刻从这种变化中得到好处。(并且,如果你不喜欢这个Compiler插件,你可以用你的实现来覆盖它)。

                        3.5.2. Maven生命周期 (Lifecycle)

上一节中,我们运行的第二个命令是mvn package。 命令行并没有指定一个插件目标,而是指定了一个Maven生命周期阶段。一个阶段是在被Maven称为“构建生命周期”中的一个步骤。生命周期是包含在一个项目构建中的一系列有序的阶段。Maven可以支持许多不同的生命周期,但是最常用的生命周期是默认的Maven生命周期,这个生命周期中一开始的一个阶段是验证项目的基本完整性,最后的一个阶段是把一个项目发布成产品。生命周期的阶段被特地留得含糊,单独的定义为验证(validation),测试 (testing),或者发布(deployment),而他们对不同项目来说意味着不同的事情。例如,打包(package)这个阶段在一个项目里生成一个JAR,它也就意味着“将一个项目打成一个jar”,而在另外一个项目里,打包这个阶段可能生成一个WAR文件。Figure 3.2, “一个生命周期是一些阶段的序列”展示了默认Maven生命周期的简单样子。

Figure 3.2. 一个生命周期是一些阶段的序列

 

插件目标可以附着在生命周期阶段上。随着Maven沿着生命周期的阶段移动,它会执行附着在特定阶段上的目标。每个阶段可能绑定了零个或者多个目标。在之前的小节里,当你运行mvn package,你可能已经注意到了不止一个目标被执行了。检查运行mvn package之后的输出,会注意到那些被运行的各种目标。当这个简单例子到达package阶段的时候,它运行了Jar插件的jar目标。既然我们的简单的quickstart项目(默认)是jar包类型,jar:jar目标被就绑定到了打包阶段。

Figure 3.3. 一个目标绑定到一个阶段

 

我们知道,在包类型为jar的项目中,打包阶段将会创建一个JAR文件。但是,在它之前的目标做什么呢,像compiler:compilesurefire:test?在Maven经过它生命周期中package之前的阶段的时候,这些目标被运行了;Maven执行一个阶段的时候,它首先会有序的执行前面的所有阶段,到命令行指定的那个阶段为止。每个阶段对应了零个或者多个目标。我们没有进行任何插件配置或者定制,所以这个例子绑定了一组标准插件的目标到默认的生命周期。当Maven经过以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 阶段。这个目标运行所有的测试并且创建那些捕捉详细测试结果的输出文件。默认情况下,如果有测试失败,这个目标会终止。

jar:jar

Jar插件的jar

  • 《Maven权威指南》学习笔记1
  • 《maven权威指南》学习笔记(更新中)
  • 《Maven权威指南》学习笔记(一)
  • 《Maven权威指南》学习笔记(二)
  • 《Maven权威指南》学习笔记(三)
  • 《Maven权威指南》学习笔记(一)
  • Maven权威指南》学习笔记(二)
  • 《Maven权威指南》学习笔记(三)
  • Maven权威指南_笔记(1)
  • 《Maven权威指南》学习笔记二十一_构建生命周期
  • juqery权威指南学习笔记-1
  • juqery权威指南学习笔记-1
  • CSS权威指南学习笔记(1)
  • Android权威编程指南学习笔记1
  • Netty权威指南学习笔记1
  • Android编程权威指南学习笔记1
  • 《netty权威指南》学习笔记1
  • Hadoop权威指南学习笔记1
  • 我的软件
  • ofstream和wofstream与中文输出问题
  • 风云的银光志Silverlight4.0教程之轻松操作剪切板
  • Bullet 引擎 详解 DBVT 分析
  • I am new here
  • 《Maven权威指南》学习笔记1
  • 2010春节后传智播客报班JAVA,想找学习的人一起团报QQ940834693
  • (JRuby) Performance Tuning
  • Internet Standard Subnetting Procedure RFC 950
  • ORA-000060: Deadlock detected: deadlock引起数据库挂死
  • A simple sample of Interactive Surface of Revolution
  • 其实不是没个人都可以隐身
  • Using eventhandler to change the folder's content type
  • FAT32解析示例
  • 原创粉丝点击