编写POM:

     Maven项目的核心是pom.xml。POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描写叙述项目怎样构建,声明项目依赖,等等。
     如今先为Hello World项目编写一个最简单的pom.xml。
<?xml version="1.0" encoding="UTF-8"?>
<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>com.juvenxu.mvnbook</groupId>
<artifactId>hello-world</artifactId>
<version>1.0-SNAPSHOT</version>
<name>Maven Hello World Project</name>
</project>
    代码的第一行是XML头,指定了该xml文档的版本号和编码方式。紧接着是project元素,project是全部pom.xml的根元素,它还声明了一些POM相关的命名空间及xsd元素,尽管这些属性不是必须的,但使用这些属性能让第三方工具能提供该xml的随笔功能。
     modelVersion指定当前POM模型的版本号,对于Maven2及Maven3来说,它仅仅能是4.0.0。
     groupId、artifactId、version这三个元素定义了一个项目主要的坐标。groupId定义了项目属于哪个组,这个组往往和项目所在的组织或公司有关联。譬如在googlecode上建立一个名为myphone的组,那么groupId就是com.googlecode.myphone。
     artifactId定义了当前Maven项目在组中唯一的ID,通常情况下是一个项目或者子项目的名字。比如myphone组下有一个项目为google-phone,你可能会为不同的子项目(模块)分配artifactId,如google-phone-util、google-phone-domain、google-phone-web。
     version指定了项目当前的版本号 1.0-SNAPSHOT,SNAPSHOT意为快照,说明还在开发中,是不稳定的版本号。version会不断升级,如1.0、1.1-SNAPSHOT。

编写主代码:

     项目主代码会被打包到终于的构件中(如jar),而測试代码仅仅会在执行測试时用到。默认情况下,项目主代码位于src/main/java文件夹,创建在该文件夹下的优点是无须额外的配置,在以后使用的过程中,Maven会自己主动搜寻该文件夹找到项目主代码。
     我们编写HelloWorld.java所在文件夹是src/main/java/com/juvenxu/mvnbook/helloworld/HelloWorld.java,则该java的文件包名为:com.juvenxu.mvnbook.helloworld,这与POM中定义的gruopId和artifactId相吻合,一般来说,项目中java类的包名都应该基于项目的groupId和artifactId,这样更加清晰,也更符合逻辑,也方便搜索构件。
package com.juvenxu.mvnbook.helloworld;
public class HelloWorld
{
public String sayHello()
{
return "Hello Maven";
}
public static void main(String[] args)
{
System.out.print(new HelloWorld().sayHello());
}
}
     代码编写完后,使用maven进行编译,在项目根文件夹下执行命令mvn clean compile会得到下面输出:

     能够看到当中运行了三个插件,maven-clean-plugin、maven-resources-plugin、maven-compile-plugin,clean会清理输出文件夹target/,resouce会处理资源文件,compile会编译项目主代码放在target/classes中(编译好的类为com/juvenxu/mvnbook/helloworld/HelloWorld.Class)。
     能够看到,Maven非常方便的运行项目的清理和编译任务。

编写測试代码:

     为了保持项目结构清晰,主代码与測试代码应该分别位于独立的文件夹中。Maven项目中的默认的測试代码文件夹是src/test/java。在编写測试用例之前,应当先创建该该文件夹。
     为了使用JUnit进行单元測试,我们须要在pom.xml中加入�对JUnit构件的依赖,改动后的pom.xml例如以下:
<?xml version="1.0" encoding="UTF-8"?>
<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>com.juvenxu.mvnbook</groupId>
<artifactId>hello-world</artifactId>
<version>1.0-SNAPSHOT</version>
<name>Maven Hello World Project</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
     代码中加入�了dependencies元素,该元素下能够包括多个dependency元素以声明项目的依赖。这里加入�了Junit的一个坐标。有了这段声明,Maven会自己主动訪问中央仓库http://search.maven.org/#browse下载所需的文件。上面pom.xml代码中另一个值为test的元素scope,scope为依赖范围,若依赖范围为test,则表示该依赖仅仅对測试有效,则在主代码中使用该JUnit就会出错,而在測试代码中使用不会出错。scope默认值为compile,表示该依赖对主代码和測试代码都有效。
     接下来编写測试代码:
package com.juvenxu.mvnbook.helloworld;

import static org.junit.Assert.assertEquals;
import org.junit.Test; public class HelloWorldTest
{
@Test
public void testSayHello()
{
HelloWorld helloWorld = new HelloWorld();
String result = helloWorld.sayHello();
assertEquals("Hello Maven",result);
}
}
     编写玩測试用例后,就能够调用maven执行測试。执行mvn clean test。(说明:较新版本号的maven不会提示Junit的Annotation无法的问题,如@Test)。   
     命令行尽管仅仅输入了mvn clean test,而maven实际所做的处理有:clean:clean(运行maven-clean-plugin的clean目标,以下类同)、resources:resources、compile:compile、resources:testRescources、compile:testCompile、surefire:test。须要知道的是,在Maven运行測试(surefire:test)之前,会先运行项目主资源的处理、主代码的编译、測试资源的处理、測试代码的编译等工作,这是maven生命周期的一个特性。測试代码通过编译之后在target/test-classes下生成了測试文件。
     maven在运行上诉处理之前,会读取pom.xml,运行一些操作,如查看相关依赖是否在本地仓库中存在,假设不存在则前往中央仓库下载。在上面的样例中,maven会去下载junit-4.7.pom和junit-4.7.jar文件。
     

打包和执行:

     hello-world的POM中没有指定打包类型,使用默认的打包类型jar。运行命令mvn clean package进行打包。
     
     maven会在打包之前运行编译、測试等操作,打包后的文件位于target/中,它时依据artifact-version.jar规则来进行命名的。
     为了让其它的maven项目直接能够该jar包,还须要运行一个安装的命令,mvn clean install ,将其安装在本地仓库中。
     
     打开本地仓库的对应文件夹能够看到hello-world项目的pom和jar。
     我们已经学习了Maven的最主要命令:mvn clean compile、mvn clean test、mvn clean package、mvn clean install。运行compile之前会先运行clean,运行test之前会先运行compile,运行package之前会先运行test、运行install之前会先运行package。
     在我们的HelloWorld类中存在一个main方法,可是默认打包生成的jar是不能直接执行的,我们须要额外在pom.xml中配置maven-shade-plugin插件来实现这个功能。
   <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.juvenxu.mavenbook.helloworld.HelloWorld</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
     plugin元素在POM中的相对位置应该在<project><build><plugins>以下。然后又一次运行mvn clean package进行打包。
     如今,我们在项目根文件夹中运行该jar文件:

 能够看到我们的main函数运行成功了。
 代码在以下地址中提供下载:http://download.csdn.net/detail/troy__/7944359

使用Archetype生成项目骨架:

     Maven中有一些约定:在项目的根文件夹中放置pom.xml,在src/main/java文件夹中放置项目的主代码,在src/test/java中放置项目的測试代码.... 假设我们每次都手动建立这些文件夹,那就太费劲了。为此,maven提供了Archetype以帮助我们高速勾勒出项目骨架。
     在你的workspace文件夹下输入:mvn archetype:generate命令。例如以下图:

    maven会要求你选择archetype的类型,普通情况下使用默认的maven-archetype-quickstart,无需输入直接回车就可以,然后会要求选择这类型的版本号,推荐maven-archetype-quickstart使用1.1。然后会要求输入该项目的一些配置信息,如groupId、artifactId、version、package。
     这里使用的是一个主要的archetype,假设有非常多项目拥有类似的自己定义项目结构以及配置文件,则能够定义自己的Archetype,在以后的项目中用自己的Archetype生成骨架。

m2eclipse简单使用:

     1. 导入Maven项目
     在实际工作中,我们差点儿是离不开IDE的,在这里我们先解说怎样从eclipse中导入Maven项目,当然前提是安装好了m2eclipse插件。
     eclipse->File->Import->Maven->Existing Maven Project,然后单击next,然后选择该Maven项目所在根文件夹。能够看到:

     然后点击Finish就可以。
     导入完毕之后,就能够在Package Explorer视图中看到例如以下图所看到的的项目结构。

    2. 创建Maven项目
     File->New->Project->Maven->Maven Project,单击Next,然后在弹出的对话框中使用默认的选项,再次点击Next(不要选择create a simple project,以便我们能使用archetype搭建骨架),接下来出现的对话框会要求选择archetype,选择maven-archetype-quicksort,然后再单击next。接着出现一个新的对话框,要求我们输入GroupId、artifactId、version、package等信息。输入完毕后,单击Finish就可以,maven项目就创建好了。

3.执行Maven命令
     利用m2eclipse能够在eclipse中运行Maven的命令,同一时候也能在Eclipse的console中看到构建输出。在Maven项目或者pom.xml上右击,再在弹出的快捷菜单中选择Run As,就能看见常见的Maven命令。
     假设没有找到想要的命令,还能够在常见的maven命令菜单中选择maven build...,在弹出的对话框中的goal栏中输入你要运行的maven命令,注意命令不要带mvn的前缀。

Maven学习笔记(三) :Maven使用入门的更多相关文章

  1. MAVEN学习笔记之Maven生命周期和插件简介(3)

    MAVEN学习笔记之Maven生命周期和插件简介(3) clean compile site三套生命周期相互独立. clean pre-clean 执行清理前的工作 clean 清理上一次构建生成的所 ...

  2. MAVEN学习笔记之Maven插件的应用(4)

    MAVEN学习笔记之Maven插件的应用(4) <build> <pluginManagement> <plugins> <plugin> <gr ...

  3. Maven 学习笔记(三)

    Maven生命周期 在上次我们使用maven package 对项目进行打包.这里就是为其指定一个生命周期.生命周期是包含在一个项目构建中的一系列有序的阶段.Maven有许多不同的生命周期,比如验证( ...

  4. maven学习笔记三(依赖特性,作用域)

    上一章中  我们看到了添加了个junit的依赖包.那么maven中想添加依赖的jar包我们只需要配置相应的dependency就行.例如: <dependency> <groupId ...

  5. Maven学习笔记:Maven简介

    Maven的概念 Maven是基于项目对象模型(POM,Project Object Model),可以通过描述信息来管理项目的构建,报告和文档的软件管理工具 Maven除了以程序构建能力为特色之外, ...

  6. maven学习记录三——maven整合ssh框架

    6       整合ssh框架 6.1     依赖传递 只添加了一个struts2-core依赖,发现项目中出现了很多jar, 这种情况 叫 依赖传递 6.2     依赖版本冲突的解决 1.  第 ...

  7. Maven学习笔记-03-Eclipse下maven项目在Tomcat7和Jetty6中部署调试

    现在最新的Eclipse Luna Release 已经内置了Maven插件,这让我们的工作简洁了不少,只要把项目直接导入就可以,不用考虑插件什么的问题,但是导入之后的项目既可以部署在Tomcat也可 ...

  8. Maven学习笔记-04-Eclipse下maven项目在Tomcat7和Jetty6中部署调试

    现在最新的Eclipse Luna Release 已经内置了Maven插件,这让我们的工作简洁了不少,只要把项目直接导入就可以,不用考虑插件什么的问题,但是导入之后的项目既可以部署在Tomcat也可 ...

  9. MAVEN学习笔记之私服Nexus(2)

    MAVEN学习笔记之私服Nexus(2) 私有服务器搭建 Nexus www.snatype.org下载 snatype-work 是默认nexus存储nexus a:将bin添加到环境中 Admin ...

随机推荐

  1. hdu 3221 Brute-force Algorithm(高速幂取模,矩阵高速幂求fib)

    http://acm.hdu.edu.cn/showproblem.php?pid=3221 一晚上搞出来这么一道题..Mark. 给出这么一个程序.问funny函数调用了多少次. 我们定义数组为所求 ...

  2. Xshell怎样登陆本地虚拟机

    Xshell怎样登陆本地虚拟机 本经验介绍了怎样使用Xshell登陆本地虚拟机,这里以centos为例.其实其它远程登陆,原理也是一样的.   工具/原料 VMware虚拟机 Xshell远程登陆工具 ...

  3. sql优化-提防错误关联

    在写sql时,在多表关联时,有时候容易把关联关系写错.一般情况下,该问题比较容易发现,但如果sql较长时,光靠眼力就比较难发现了.今天写了一个脚本,碰到该问题了. 第一版本的脚本如下: select ...

  4. UVA 10140 - Prime Distance(数论)

    10140 - Prime Distance 题目链接 题意:求[l,r]区间内近期和最远的素数对. 思路:素数打表,打到sqrt(Max)就可以,然后利用大的表去筛素数.因为[l, r]最多100W ...

  5. codeforces#256DIV2 D题Multiplication Table

    题目地址:http://codeforces.com/contest/448/problem/D 当时是依照找规律做的,规律倒是找出来了,可是非常麻烦非常麻烦. . 看到前几名的红名爷们3分钟就过了, ...

  6. SE 2014年4月14日

    一. 概述BGP的特点 BGP协议是一种距离矢量协议,基于TCP的179端口,BGP协议不会动态的学习路由,只能将IGP协议学习到的或者静态路由注入到BGP中,成为BGP路由,BGP路由携带有丰富的路 ...

  7. Knockout应用开发指南 第二章:监控属性(Observables)

    原文:Knockout应用开发指南 第二章:监控属性(Observables) 关于Knockout的3个重要概念(Observables,DependentObservables,Observabl ...

  8. Java如何检查List<String> 里是否有想要的字符串?

    List<String> test = new ArrayList<String>(); test.add("a"); test.add("b&q ...

  9. ie6下margin双倍距的问题

    今天中午休息时, 公司客服突然报出来一个bug, 一个用ie6的用户打开我们活动网站时, 发现内容都错乱了, 我赶紧上线一看, 发现是正常的. 找了台ie6的xp机器再看了下, 重现出了这个用户的问题 ...

  10. Jquery中toggleClass的两种用法

    css样式: <style type="text/css"> .bgc{ background-color:#F00; color: #FFF} </style& ...