您的位置:首页 > 其它

Maven学习笔记

2011-07-16 22:05 281 查看
是什么?

一个更正式的 Apache Maven1 的定义: Maven是一个项目管理工具,它包含了一个项

目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project

Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在

生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。

特点:

1、约定优于配置:约定存放的目录简单;统一的约定来编译源代码,打包可分发的

构件,生成 web 站点,还有许多其他的过程。

2、一个一般接口:

3、基于Maven插件的全局性重用:

4、一个“项目”的概念模型:Maven 维护了一个项目的模型,你不仅仅需要把源码编译成字节码,你还需要开发软

件项目的描述信息,为项目指定一组唯一的坐标。它是包含了一组关于软件项目和软件开发的语义规则的平台

5、比较

Apache Ant

• Ant 没有正式的约定如一个一般项目的目录结构,你必须明确的告诉 Ant 哪

里去找源代码,哪里放置输出。随着时间的推移,非正式的约定出现了,但是

它们还没有在产品中模式化。

• Ant 是程序化的,你必须明确的告诉 Ant 做什么,什么时候做。你必须告诉

它去编译,然后复制,然后压缩。

• Ant 没有生命周期,你必须定义目标和目标之间的依赖。你必须手工为每个目

标附上一个任务序列。

Apache Maven

• Maven 拥有约定,因为你遵循了约定,它已经知道你的源代码在哪里。它把字

节码放到 target/classes ,然后在 target 生成一个 JAR 文件。

• Maven 是声明式的。你需要做的只是创建一个 pom.xml 文件然后将源代码放

到默认的目录。Maven 会帮你处理其它的事情。

• Maven 有一个生命周期,当你运行 mvn install 的时候被调用。这条命令告

诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命

周期旅途中的一个影响就是,Maven 运行了许多默认的插件目标,这些目标完

成了像编译和创建一个 JAR 文件这样的工作。

6、安装细节:

Maven的下载文件只有大概1.5 MiB,它能达到如此苗条的大小是因为Maven的内核被设

计成根据需要从远程仓库获取插件和依赖。当你开始使用Maven,它会开始下载插件到

本地仓库中。

当你不再仅仅满足于使用Maven,还想扩展它的时候,你会注意到Maven创建了一些本地

的用户相关的文件,还有在你home目录的本地仓库。在~/.m2(c:/document /users/)目录下有:

~/.m2/settings.xml

该文件包含了用户相关的认证,仓库和其它信息的配置,用来自定义Maven的行

为。例如需要自定义远程库,而不仅限于Maven中心仓库。添加淘宝中心仓库

<repository>

<id>central</id>

<url>http://code.taobao.org/mvn/repository/</url>

<releases>

<enabled>true</enabled>

</releases>

<snapshots>

<enabled>false</enabled>

</snapshots>

</repository>

~/.m2/repository/

该目录是你本地的仓库。当你从远程Maven仓库下载依赖的时候,Maven在你本地

仓库存储了这个依赖的一个副本。(mvn install 后形成目录~\.m2\repository\org\sonatype\mavenbook\ch03\simple)

注意:

在Unix(和OSX)上,可以用 ~ 符号来表示你的home目录,(如~/bin表示/

home/tobrien/bin)。在Windows上,我们仍然使用 ~ 来表示你的home

目录。在Windows XP上,你的home目录是 C:\Documents and Settings

\tobrien,在Windows Vista上,你的home目录是 C:\Users\tobrien。从现

在开始,你应该能够理解这种路径表示,并翻译成你操作系统上的对应路

怎么用?Demo

1、创建一个简单的项目

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

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

-DartifactId=simple \

-DpackageName=org.sonatype.mavenbook

目录D:\simple\src\main\java\org\sonatype\mavenbook

其中org.sonatype.mavenbook.App.java为Maven Archtype插件生成了一个简单的类(只要执行该插件都会生成)

mvn 是Maven2的命令。archetype:create称为一个Maven目标 (goal)

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

simple/¶

simple/pom.xml·

/src/

/src/main/¸

/main/java

/src/test/¹

/test/java

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

新建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-<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>

Archetype插件通过名字为pom.xml的文件创建了一个项目。这就是项目对象模型

(POM),一个项目的声明性描述。当Maven运行一个目标的时候,每个目标都会访问定

义在项目POM里的信息。当jar:jar目标需要创建一个JAR文件的时候,它通过观察POM来

找出这个Jar文件的名字。当compiler:compile任务编译Java源代码为字节码的时候,

它通过观察POM来看是否有编译目标的参数。目标在POM的上下文中运行。目标是我们

希望针对项目运行的动作,而项目是通过POM定义的。

2、构建一个简单的项目

想要构建打包这个应用,在包含pom.xml的目录下运行mvn install。

$ mvn install

你已经创建了,编译了,测试了,打包了,并且安装了(installed)最简单的Maven项

目。在命令行运行它以向你自己验证这个程序能工作。

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

结果:Hello World!

3、核心概念

Maven插件和目标 (Plugins and Goals)

为了运行单个的Maven插件目标,我们使用mvn archetype:create这样的语

法,这里archetype是一个插件标识而create是目标标识。

一个目标是一个明确的任务,它可以作为单独的目标运行,或者作为一个大的构

建的一部分和其它目标一起运行

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

-DartifactId=simple \

-DpackageName=org.sonatype.mavenbook

一个Maven插件是一个单个或者多个目标的集合(包含多个目标)。Maven插件的例子有一些简单但核心的

插件,像Jar插件,它包含了一组创建JAR文件的目标,Compiler插件的compile目标,它包含了一组编

译源代码和测试代码的目标,或者Surefire插件中的test目标,它包含一组运行单元测试和生成测试报告的目标。

在archetype:create这个例子中,我们并没有在命令行中指定这个目标创建什么类型的archetype,我们简单

的传入一个groupId和一个artifactId。这是我们对于约定优于配置(convention over

configuration)的第一笔。这里create目标的约定,或者默认值,是创建一个简单的项

目,叫做Quickstart。create目标定义了一个配置属性archetypeArtifactId,它有一个默认值为maven-archetype-quickstart

Maven生命周期 (Lifecycle)

Maven可以支

持许多不同的生命周期,但是最常用的生命周期是默认的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目标绑定到了package 阶段。这个目标把输出目录打包成JAR文

件。

Maven坐标 (Coordinates)

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

<artifactId>simple</artifactId>

<packaging>jar</packaging>

<version>1.0-SNAPSHOT</version>

Maven坐标定义了一组标识,它们可以用来唯一标识一个项目,一个依赖,或者MavenPOM里的一个插件

一个项目的groupId:artifactId:version使之成为一个独一无二的项目;你不能同

时有一个拥有同样的groupId, artifactId和version标识的项目。

POM为项目命名,提供了项目的一组唯一标识符(坐标),并且通过依赖 (dependencies) ,父 (parents) 和先决条件

(prerequisite) 来定义和其它项目的关系。

groupIdd 团体,公司,小组,组织,项目,或者其它团体。团体标识的约定是,它以创

建这个项目的组织名称的逆向域名(reverse domain name)开头。来自Sonatype的项目有一个以com.sonatype开头的groupId,而Apache Software的项目有以org.apache开头的groupId。

artifactId

在groupId下的表示一个单独项目的唯一标识符。

version

一个项目的特定版本。发布的项目有一个固定的版本标识来指向该项目的某一个

特定的版本。而正在开发中的项目可以用一个特殊的标识,这种标识给版本加上

一个“SNAPSHOT”的标记。

Maven仓库(Repositories)

当你第一次运行Maven的时候,你会注意到Maven从一个远程的Maven仓库下载了许多文

件。如果这个简单的项目是你第一次运行Maven,那么当触发resources:resource目标

的时候,它首先会做的事情是去下载最新版本的Resources插件。在Maven中,构件和

插件是在它们被需要的时候从远程的仓库取来的。

。Maven自带了一个用来下载Maven核心插件和依赖的远程仓库地址(http://repo1.maven.org/maven2/最新http://search.maven.org/#browse)。

Maven依赖管理 (Dependency Management)

一个复杂的项目将会包含很多依赖,也有可能包含依赖于其它构件的依赖。这是Maven

最强大的特征之一,它支持了传递性依赖(transitive dependencies)。

Maven也提供了不同的依赖范围(dependency scope)

当一个依赖的范围是test的时候,说明它在Compiler插件运行compile目标的时候是不可用的。它只有在运

行compiler:testCompile和surefire:test目标的时候才会被加入到classpath中。

provided范围告诉Maven一个依赖在编译的时候需要,但是它不应该被捆绑在构建的输出中。当你

开发web应用的时候provided范围变得十分有用。

站点生成和报告 (Site Generation and Reporting)

另外一个Maven的重要特征是,它能生成文档和报告。在simple项目的目录下,运行以

下命令:

$ mvn site

这将会运行site生命周期阶段

Site生命周期只关心处理在src/site目录下的site内容,还有生成

报告

附录:Maven 2 的主要Archetype Plugin

maven-archetype-archetype

maven-archetype-j2ee-simple

maven-archetype-mojo

maven-archetype-portlet

maven-archetype-profiles (currently under development)

maven-archetype-quickstart

maven-archetype-simple (currently under development)

maven-archetype-site

maven-archetype-site-simple, and

maven-archetype-webapp

================20120628==================代理库使用

sonatype Nexus Maven仓库管理器

可以使用Nexus 来管理和依赖本地资源,即使它们不包含在Maven中央库中,Nexus相当于一个本地资源库服务器,我们在上传相应资源到

该服务器,我们在依赖中就可以从该服务器下载相应的资源,前提是我们要修改Maven的下载默认的中央库,即修改下载资源的默认地址。

可以从~/.m2/setting.xml 修改

在你将Nexus配置成所有仓库的镜像之后,Maven现在会从本地的Nexus安装查阅,而非

去外面查阅中央Maven仓库。如果对Nexus有一个构件请求,本地的Nexus安装会提供这

个构件。如果Nexus没有这个构件,Nexus会从远程仓库获取这个构件,然后添加至远程

仓库的本地镜像

1、使用Nexus中央代理仓库

<mirror>

<id>nexus</id>

<name>Nexus Public Mirror</name>

<url>http://localhost:8081/nexus/content/groups/public</url>

<mirrorOf>central</mirrorOf>

2、以上的Maven配置能让你使用Nexus公共组,这

个组从4个由Nexus管理的仓库解析构件,但是它不让你查阅public-snapshots组,该组

包括了Apache和Codehaus的快照版。要配置Maven让它为发布版和插件都使用Nexus,你

必须配置Maven,通过往你的Maven文件~/.m2/settings.xml中添加如下的镜像配置,使

其查阅Nexus的组。

<mirror>

<!--This is used to direct the public snapshots repo in the

profile below over to a different nexus group -->

<id>nexus-public-snapshots</id>

<mirrorOf>public-snapshots</mirrorOf>

<url>http://localhost:8081/nexus/content/groups/public-snapshots</url>

</mirror>

<mirror>

<!--This sends everything else to /public -->

<id>nexus</id>

<mirrorOf>*</mirrorOf>

<url>http://localhost:8081/nexus/content/groups/public</url>

</mirror>

<profile>

<id>Nexus</id>

<repositories>

<repository>

<id>central</id>

<url>http://central</url>

<releases>

<enabled>true</enabled>

</releases>

<snapshots>

<enabled>true</enabled>

</snapshots>

</repository>

</repositories>

<pluginRepositories>

<pluginRepository>

<id>central</id>

<url>http://central</url>

<releases>

<enabled>true</enabled>

</releases>

<snapshots>

<enabled>true</enabled>

</snapshots>

</pluginRepository>

</pluginRepositories>

</profile>

<profile>

<!--this profile will allow snapshots to be searched when activated-->

<id>public-snapshots</id>

<repositories>

<repository>

<id>public-snapshots</id>

<url>http://public-snapshots</url>

<releases><enabled>false</enabled></releases>

<snapshots><enabled>true</enabled></snapshots>

</repository>

</repositories>

<pluginRepositories>

<pluginRepository>

<id>public-snapshots</id>

<url>http://public-snapshots</url>

<releases><enabled>false</enabled></releases>

<snapshots><enabled>true</enabled></snapshots>

</pluginRepository>

</pluginRepositories>

</profile>

3、

<activeProfiles>

<activeProfile>nexus</activeProfile>

</activeProfiles>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: