Marven:使用Maven构建Java项目

一、Maven是什么?

Maven 是一个项目管理和构建自动化工具。Maven基于POMProject object model),能够管理项目的构建、报表、文档等信息。

我们这里主要讲的Maven的项目构建功能。有了Maven,我们可以方便的管理Java项目的生命周期和依赖。通过定义一个POM文件,我们就可以自动的完成编译、测试、打包甚至发布等过程。


 二、为什么要用Maven

做过Java项目的童鞋都知道,一个项目中Java代码经常会依赖其他的jar包中的class,或者依赖其它的项目,手动添加依赖是一个比较麻烦的事,尤其类似A依赖BB又依赖CC依赖D这种情况。

有了Maven,我们只需要在POM文件中定义依赖AMaven就可以自动的添加其他所需的依赖了。

Maven还有很多有用的插件来帮助我们完成其他麻烦的事情,比如打包。Maven本身是Java开发,所以开发Maven的插件也比较简单,但是我们这里不深入研究。

另外,有人会问MavenAnt的区别,我想说,你可以在《Maven权威指南》第一章的1.6节找到答案。

Maven还能降一个项目转化为Eclipse可以支持的项目,便于导入Eclipse。现在Eclipse也有插件支持Maven了,叫做 m2eclipse


 三、Maven有哪些常识?

Maven有个概念叫做“约定优于配置Convention Over Configuration)”,意思就是很多东西都是预先约定好的,我们不需要进行修改,只需要按照这种方式来就好了。比如项目的目录结构,Maven约定成如下:

目录

目的

${basedir}

存放 pom.xml和所有的子目录

${basedir}/src/main/java

项目的 java源代码

${basedir}/src/main/resources

项目的资源,比如说 property文件

${basedir}/src/test/java

项目的测试类,比如说 JUnit代码

${basedir}/src/test/resources

测试使用的资源

${basedir}/target/classes

编译后的class文件

${basedir}/target

打包的Jar文件

 

Maven有三套相互独立的生命周期,Clean Lifecycle 在进行真正的构建之前进行一些清理工作。

  • Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
  • Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
  • Site Lifecycle 生成项目报告,站点,发布站点。

 核心部分的生命周期划分为以下几个阶段:

生命周期阶段

描述

validate

验证项目是否正确,以及所有为了完整构建必要的信息是否可用

generate-sources

生成所有需要包含在编译过程中的源代码

process-sources

处理源代码,比如过滤一些值

generate-resources

生成所有需要包含在打包过程中的资源文件

process-resources

复制并处理资源文件至目标目录,准备打包

compile

编译项目的源代码

process-classes

后处理编译生成的文件,例如对Java类进行字节码增强(bytecode enhancement)

generate-test-sources

生成所有包含在测试编译过程中的测试源码

process-test-sources

处理测试源码,比如过滤一些值

generate-test-resources

生成测试需要的资源文件

process-test-resources

复制并处理测试资源文件至测试目标目录

test-compile

编译测试源码至测试目标目录

test

使用合适的单元测试框架运行测试。这些测试应该不需要代码被打包或发布

prepare-package

在真正的打包之前,执行一些准备打包必要的操作。这通常会产生一个包的展开的处理过的版本(将会在Maven 2.1+中实现)

package

将编译好的代码打包成可分发的格式,如JAR,WAR,或者EAR

pre-integration-test

执行一些在集成测试运行之前需要的动作。如建立集成测试需要的环境

integration-test

如果有必要的话,处理包并发布至集成测试可以运行的环境

post-integration-test

执行一些在集成测试运行之后需要的动作。如清理集成测试环境。

verify

执行所有检查,验证包是有效的,符合质量规范

install

安装包至本地仓库,以备本地的其它项目作为依赖使用

deploy

复制最终的包至远程仓库,共享给其它开发人员和项目(通常和一次正式的发布相关)

 

Maven插件和目标。使用Maven的过程,其实也是执行一个个Maven插件的过程。比如我们执行compile编译的时候,其实是调用Mavenmaven-compiler-plugin插件完成的。还有很多插件包括maven-clean-pluginmaven-dependency-pluginmaven-assembly-plugin等。每一个插件都有相应的目标,每一个目标都是一个可以单独执行的任务。后面我们在命令行中使用

mvn archetype:create -DgroupId=com.dc.test -DartifactId=helloworld

快速创建一个Java项目的时候,我们其实也是执行了archetype插件的create目标,并给这个目标传递了groupIdartifactId的参数。

Maven仓库。Maven运行的时候,需要的插件都是从中央仓库(在配置文件中指定,有默认的,就像Linux的安装源一样)下载,下载之后,会存在本地的仓库中,下次使用就不用再去下载了,Maven本身很小,但是本地仓库在使用之后会越来越大(笔者用了几次之后仓库就用1G多了)。

Maven坐标。Maven坐标定义了一组标识,它们可以用来唯一标识一个项目,一个依赖,或者Maven POM里的一个插件。一般坐标使用groupId, artifactId, versionpackaging来实现:

名称

作用

groupId

团体,公司,小组,组织,项目,或者其它团体。团体标识的约定是,它以创建这个项目的组织名称的逆向域名(reverse domain name)开头。来自Sonatype的项目有一个以com.sonatype开头的groupId,而Apache Software的项目有以

org.apache开头的groupId。

 

artifactId

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

version

一个项目的特定版本。发布的项目有一个固定的版本标识来指向该项目的某一个
特定的版本。而正在开发中的项目可以用一个特殊的标识,这种标识给版本加上
一个“SNAPSHOT”的标记。

packaging

项目的类型,默认是jar,描述了项目打包后的输出。类型为jar的项目产生一个
JAR文件,类型为war的项目产生一个web应用。

 

POM文件(pom.xml)。当Maven运行的时候它向项目对象模型(POM)查看关于这个项目的信息。POM回答类似这样的问题:这个项目是什么类型的?这个项目的名称是什么?这个项目的构建有自定义么?详细的POM语法查看Maven官网的POM Reference

下面是一个由Maven Archetype插件的create目标创建的默认的pom.xml文件:

[html] view plain copy print ?
  1. <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">  
  2.     <modelVersion>4.0.0</modelVersion>  
  3.     <groupId>org.sonatype.mavenbook.ch03</groupId>  
  4.     <artifactId>simple</artifactId>  
  5.     <packaging>jar</packaging>  
  6.     <version>1.0-SNAPSHOT</version>  
  7.     <name>simple</name>  
  8.     <url>http://maven.apache.org</url>  
  9.     <dependencies>  
  10.         <dependency>  
  11.             <groupId>junit</groupId>  
  12.             <artifactId>junit</artifactId>  
  13.             <version>3.8.1</version>  
  14.             <scope>test</scope>  
  15.         </dependency>  
  16.     </dependencies>  
  17. </project>  


四、怎么快速用Maven构建一个Java项目?

1) 首先下载Maven,地址:http://maven.apache.org/

2) 修改 Maven 的本地仓库地址,在Maven安装目录下的conf/settings.xml中修改localRepository节点

 

3) 如果要使用m2eclipse插件(这里用的EclipseLuna版本),配置

修改插件的Maven配置文件路径为外部的Maven

打开Eclipse菜单Window - Preference,修改如下

 Marven:使用Maven构建Java项目_第1张图片

  4) 快速创建一个HelloWorld项目。我们

 Marven:使用Maven构建Java项目_第2张图片

 其中-DinteractiveMode表示我们使用的是非交互模式,在创建过程中我们不需要选择和输入参数。

我们查看目录,发现默认生成了如下的代码

 

 Marven:使用Maven构建Java项目_第3张图片

以及默认的POM文件

 

切换到pom.xml文件所在目录,

使用mvn compile进行编译(会默认执行compile前面所有生命周期阶段)

 Marven:使用Maven构建Java项目_第4张图片

使用mvn test进行测试(会默认执行test前面所有的生命周期阶段)

 Marven:使用Maven构建Java项目_第5张图片

需要用到其他依赖的时候,在如下地址进行搜索:

http://search.maven.org/

比如需要使用mahout

 

拷贝结果中的pom到本地项目中POM文件中对应的位置即可,就可以自动完成依赖的管理。

 Marven:使用Maven构建Java项目_第6张图片

要直接支持某个含main函数的类时,可以使用exec-maven-plugin,详细了解移步http://mojo.codehaus.org/exec-maven-plugin/

 Marven:使用Maven构建Java项目_第7张图片

要打包jar文件时,可以使用shade插件,支持精简jar包,去掉没有用到的东西。另外也有一些其他打包的插件,可以自己查阅。shade插件深入了解移步http://maven.apache.org/plugins/maven-shade-plugin/

 

要将项目转换为Eclipse支持的项目,使用mvn eclipse:eclipse命令,我们就可以使用Eclipse导入了。

 

五、参考文献:

maven权威指南》

maven实战》

Maven官网:

http://maven.apache.org/

Oracle 教程:

http://www.oracle.com/technetwork/cn/community/java/apache-maven-getting-started-1-406235-zhs.html

http://my.oschina.net/heguangdong/blog/50302

你可能感兴趣的:(Marven:使用Maven构建Java项目)