首页 > 代码库 > Maven学习
Maven学习
前言
Hadoop的MapReduce环境是一个复杂的编程环境,所以我们要尽可能地简化构建MapReduce项目的过程。Maven是一个很不错的自动化项目构建工具,通过Maven来帮助我们从复杂的环境配置中解脱出来,从而标准化开发过程。所以,写MapReduce之前,让我们先花点时间把刀磨快!!当然,除了Maven还有其他的选择Gradle(推荐), Ivy….
目录
Maven介绍
Maven安装(win)
Maven插件安装
Maven常用命令
创建一个简单的Maven项目
Maven基础概念介绍
1. Maven介绍
Apache Maven,是一个Java的项目管理及自动构建工具,由Apache软件基金会所提供。基于项目对象模型(Project Object Model))概念,Maven利用一个中央信息片段能管理一个项目的构建、报告和文档等步骤。曾是Jakarta项目的子项目,现为独立Apache项目。
maven的开发者在他们开发网站上指出,maven的目标是要使得项目的构建更加容易,它把编译、打包、测试、发布等开发过程中的不同环节有机的串联了起来,并产生一致的、高质量的项目信息,使得项目成员能够及时地得到反馈。maven有效地支持了测试优先、持续集成,体现了鼓励沟通,及时反馈的 软件开发理念。如果说Ant的复用是建立在"拷贝–粘贴"的基础上的,那么Maven通过插件的机制实现了项目构建逻辑的真正复用。
2. Maven安装(win)
下载Maven:http://maven.apache.org/download.cgi
下载最新的xxx-bin.zip文件,在win上解压到: F:\Tools\DevelopTool\maven
并把maven/bin目录设置在环境变量PATH:F:\Tools\DevelopTool\maven\bin
3. Maven插件安装配置
Maven插件安装配置参见:http://www.blogjava.net/fancydeepin/archive/2012/07/13/eclipse_maven3_plugin.html
4. Maven常用命令
mvn的命令有很多,在项目开发中,理解了下面的几个常用命令后,运用maven就没有问题了。
(1) 常用的mvn命令
mvn archetype:create 创建 Maven 项目
mvn compile 编译主程序源代码,不会编译test目录的源代码。第一次运行时,会下载相关的依赖包,可能会比较费时
mvn test-compile 编译测试代码,compile之后会生成target文件夹,主程序编译在classes下面,测试程序放在test-classes下
mvn test 运行应用程序中的单元测试
mvn site 生成项目相关信息的网站
mvn clean 清除目标目录中的生成结果
mvn package 依据项目生成 jar 文件,打包之前会进行编译,测试
mvn install 在本地 Repository 中安装 jar。
mvn eclipse:eclipse 生成 Eclipse 项目文件及包引用定义
mvn deploy 在整合或者发布环境下执行,将最终版本的包拷贝到远程 的repository,使得其他的开发者或者工程可以共享。
(2) 一些高级功能命令
跳过测试类 : -Dmaven.test.skip=true
下载jar包源码: -DdownloadSource=true
下载javadocs: -DdownloadJavadocs=true
例如:
mvn package -Dmaven.test.skip=true :表示打包时忽略掉test目录,不编译。
mvn install -DdownloadSource=true :本地安装jar包时,下载jar的源文件包。
让我们从开发一个十分简单的例子开始探究Maven的核心概念。通过学习,你将会对构建生命周期 (buildlifecycle),Maven仓库 (repositories),依赖管理 (dependency management)和项目对象模型 (Project Object Model)有一个基本的理解。
5. 创建一个简单的Maven项目
(1)mvn创建项目
01. JAVA项目:mvn archetype:create - DgroupId=net.bwda -DartifactId=common
02. web 项目: mvn archetype:create - DgroupId=net.bwda -DartifactId=web-app - DarchetypeArtifactId=maven-archetype- webapp
默认情况下:
源代码在:{basedir}/src/main/java
资源文件在:{basedir}/src/main/resources
测试代码在:{basedir}/src/test
(2) 创建一个简单的项目
mvn archetype:create -DgroupId=org.sonatype.mavenbook.ch03 -DartifactId=simple -DpackageName=org.sonatype.mavenbook
mvn :是Maven2的命令。
archetype:create:是一个Maven目标,用来创建一个入门项目的骨架。
-Dname=value对:是将被传到目标中的参数。它们使用-D属性这样的形式,类似于你通过命令行向Java虚拟机传递系统属性。
(3) 参数与项目分析
例如:archetype:create这个目标,通过 archetype快速创建一个项目。一个archetype被定义为"一个原始的模型或者类型",在它之后的参数与之匹配。Maven有许多可用的archetype,从生成一个简单的Swing应用,到一个复杂的Web应用。最基本的 archetype,可用来创建一个入门项目的骨架。这个插件的前缀是"archetype",目标为"create"。
(4) mvn的标准目录布局
通过上面,我们已经创建了一个基本的mvn项目。查看simple文件夹,目录层次如下:
|---simple
|---pom.xml
|---src
|---main
|---java
|---test
|---java
以上的目录层次是mvn的标准目录布局
01.maven Archtype插件:创建了一个与artifactId匹配的目录:simple。
02. pom.xml:每个项目都有一个pom.xml,里面有它的项目对象模型。描述这个项目配置的插件,声明的依赖。也就是说,配置jar包依赖关系,仓库地址等都是通过这个文件配置。
03. src/main目录:用于存放项目的源码了资源文件。这个目录包含了一下java类和一些配置文件。在一个Java项目中,Java类放在src/main/java下面,而classpath资源文件放在src/main/resources下面。
04. src/test:存放项目的测试用例。在这个目录下面,src/test/java存放像使用JUnit这样的Java测试类。目录src/test/resources下存放测试classpath资源文件。
(5) 构建项目
01. 进入控制台,cmd进入simple目录
02. 输入 mvn install命令,执行构建
03. 生成eclipse工程项目,输入: mvn eclipse:eclipse,然后将工程导入到eclipse工程即可。
6. mvn基础概念介绍
任何您想build的事物,Maven都可以认为它们是工程。 这些工程被定义为工程对象模型(Poject Object Model)。 一个工程可以依赖其它的工程;一个工程也可以由多个子工程构成。
(1) Maven坐标
Archetype插件,通过名字为pom.xml的文件创建了一个项目。这就是项目对象模型(POM),一个项目的声明性描述。当Maven运行 一个目标的时候,每个目标都会访问定义在项目POM里的信息。
jar:jar目标:需要创建一个JAR文件的时候,它通过观察POM来找出这个Jar文件的名字。
compile:compile任务:编译Java源代码为字节码的时候,它通过观察POM来看是否有编译目标的参数。
(2) POM信息
目标在POM的上下文中运行。目标是我们希望针对项目运行的动作,而项目是通过POM定义的。POM为项目命名,提供了项目的一组唯一标识符,并且通过依赖 (dependencies) ,父 (parents) 和先决条件 (prerequisite) 来定义和其它项目的关系。POM也可以自定义插件行为,提供项目相关的社区和开发人员的信息。Maven坐标定义了一组标识,它们可以用来唯一标识一个项目,一个依赖,或者MavenPOM里的一个插件。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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.sonatype.mavenbook.ch03</groupId>
<artifactId>simple</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>simple</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
GroupId:团体,公司,小组,组织,项目,或者其它团体。groupId是一个工程的在全局中唯一的标识符,一般地,它就是工程名。groupId有利于使用一个完全的包名,将一个工程从其它有类似名称的工程里区别出来。
Artifact:在groupId下的表示一个单独项目的唯一标识符。artifact是工程为要产生或需要使用的文件,生成一个标识符。这些文件可以是 jar文件,源文件,二进制文件,war文件,甚至是pom文件。每个artifact,由groupId和artifactId组合的标识符唯一识别。需要 被使用的artifact都要放在仓库中,否则 Maven无法找到它们。
version:一个项目的特定版本。发布的项目有一个固定的版本标识来指向该项目的某一个特定的版本。而正在开发中的项目可以用一个特殊的标识,这种标识给版本加上一个"SNAPSHOT"的标记。
Packaging项目的类型:默认是jar,描述了项目打包后的输出。类型为jar的项目产生一个JAR文件,类型为war的项目产生一个web应用。包括EAR、WAR、JAR、ZIP、EJB几种类型。
项目的打包格式也是Maven坐标的重要组成部分,但是它不是项目唯一标识符的一个部分。一个项目的groupId:artifactId:version使之成为一个独一无二的项目;你不能同时有一个拥有同样的groupId, artifactId和version标识的项目。
Dependency:为了能够build或运行,一个典型的Java工程会依赖其它的包。在Maven中,这些被依赖的包就被称为 dependency。dependency一般是其它工程的artifact。
Plug-in:Maven是由插件组织的,它的每一个功能都是由插件提供的。插件提供goal,并根据在POM中找到的元数据去完成工作。主要的Maven插件要是由Java写成 的,但它也支持用Beanshell或Ant脚本写成的插件。
Repository:仓库用于存放artifact,它可以是本地仓库,也可以是远程仓库。Maven有一个默认的远程仓库--central,可以下载其中的artifact。在Windows 平台上,本地仓库的默认地址是User_Home.m2.Repository。
Snapshot:工程中可以有一个特殊版本,它的版本号 包括SNAPSHOT字样。该版本可以告诉Maven,该工程正处于开发阶段,会经常更新(但还未发布)。当其它工程使用此类型版本的artifact 时,Maven会在仓库中寻找该artifact的最新版本,并自动下载、使用该最新版。
(3) Maven仓库(Repositories)
当你第一次运行Maven的时候,你会注意到Maven从一个远程的Maven仓库下载了许多文件。如果这个简单的项目是你第一次运行 Maven,它首先会做的事情是去下载最新版本的Resources插件。在Maven中,构件和插件是在它们被需要的时候从远程的仓库取来的。 Maven自带了一个用来下载Maven核心插件和依赖的远程仓库地址(http://repo1.maven.org/maven2),现已变更到 http://search.maven.org/。
Maven仓库是通过结构来定义的,在一个Maven仓库中,所有的东西存储在一个与Maven项目坐标十分匹配的目录结构中。 你可以访问Maven仓库http://search.maven.org/,搜索commons-io。你能在结果中找到相应的 commons-io所对应的pom.xml,将该配置拷贝到你本地的pom。在Windows上,你的本地仓库C:\Documents and Settings\USERNAME\.m2\repository。在Unix系统上,你的本地仓库在~/.m2/repository。
当你执行mvn install时,把你项目的构件安装到你的本地仓库。Maven会从远程仓库下载构件和插件到你本机上,存储在你的本地Maven仓库里。一旦 Maven已经从远程仓库下载了一个构件,它将永远不需要再下载一次,因为maven会首先在本地仓库查找插件,然后才从其他设置的仓库获取。
(4) Maven依赖管理
上面的例子中,Maven处理了JUnit依赖的坐标:junit:junit:3.8.1,指向本地Maven仓库中的/junit/junit /3.8.1/junit-3.8.1.jar。这种基于Maven坐标的定位构件的能力能让我们在项目的POM中定义依赖。如果你检查simple项目 的pom.xml文件,你会看到有一个文件中有一个段,专门处理dependencies,那里面包含了一个单独的依赖:JUnit。
一个复杂的项目将会包含很多依赖,也有可能包含依赖于其它构件的依赖。这是Maven最强大的特征之一,它支持了传递性依赖(transitive dependencies)。假如你的项目依赖于一个库,而这个库又依赖于五个或者十个其它的库。你不必找出所有这些依赖然后把它们写在你的pom.xml里,你只需要加上你直接依赖的那些库,Maven会隐式的把 这些库间接依赖的库也加入到你的项目中。Maven也会处理这些依赖中的冲突,同时能让你自定义默认行为,或者排除一些特定的传递性依赖。
Maven学习