maven用途、核心概念、用法、常用参数和命令、扩展

标签: maven 核心 概念 | 发表时间:2014-09-13 16:19 | 作者:xiajs
出处:http://www.iteye.com

本文由浅入深,主要介绍 maven的用途核心概念(Pom、Repositories、Artifact、Build Lifecycle、Goal)介绍、 用法( Archetype意义及 创建各种项目)maven 常用参数和命令 以及简单故障排除 、maven扩展(eclipse、cobertura、findbugs、插件开发)、 maven配置

本文较长,可根据个人需要有选择性的查看,比如先看用法再回过头来看核心概念

 

1、maven的用途

maven是一个 项目构建和管理的工具,提供了帮助管理  构建文档报告依赖scms发布分发的方法。可以方便的编译代码、进行依赖管理、管理二进制库等等。

maven的好处在于可以将项目过程规范化、自动化、高效化以及强大的可扩展性

利用maven自身及其插件还可以获得代码检查报告、单元测试覆盖率、实现持续集成等等。

 

2、maven的核心概念介绍

2.1 Pom

pom是指project object Model。pom是一个xml,在maven2里为 pom.xml。是maven工作的基础,在执行task或者goal时,maven会去项目根目录下读取pom.xml获得需要的配置信息

pom文件中包含了 项目的信息和maven build项目所需的配置信息,通常有项目信息(如版本、成员)、项目的依赖、插件和goal、build选项等等

pom是可以继承的,通常对于一个大型的项目或是多个module的情况,子模块的pom需要指定父模块的pom

 

pom文件中节点为

Java代码   收藏代码
  1. project pom文件的顶级元素  
  2. modelVersion 所使用的object model版本,为了确保稳定的使用,这个元素是强制性的。除非maven开发者升级模板,否则不需要修改  
  3. groupId 是项目创建团体或组织的唯一标志符,通常是域名倒写,如groupId  org.apache.maven.plugins就是为所有maven插件预留的  
  4. artifactId 是项目artifact唯一的基地址名  
  5. packaging artifact打包的方式,如jar、war、ear等等。默认为jar。这个不仅表示项目最终产生何种后缀的文件,也表示build过程使用什么样的<a href="http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Built-in_Lifecycle_Bindings" target="_blank">lifecycle</a>。  
  6. version artifact的版本,通常能看见为类似0.0.1-SNAPSHOT,其中SNAPSHOT表示项目开发中,为开发版本  
  7. name 表示项目的展现名,在maven生成的文档中使用  
  8. url表示项目的地址,在maven生成的文档中使用  
  9. description 表示项目的描述,在maven生成的文档中使用  
  10. dependencies 表示依赖,在子节点dependencies中添加具体依赖的groupId artifactId和version  
  11. build 表示build配置  
  12. parent 表示父pom  

其中 groupId:artifactId:version唯一确定了一个artifact

 

2.2 Artifact

这个有点不好解释,大致说就是一个项目将要产生的文件,可以是jar文件,源文件,二进制文件,war文件,甚至是pom文件。每个artifact都由 groupId:artifactId:version组成的标识符唯一识别。需要被使用(依赖)的artifact都要放在仓库(见Repository)中

 

2.3 Repositories

Repositories是用来存储Artifact的。如果说我们的项目产生的Artifact是一个个小工具,那么Repositories就是一个仓库,里面有我们自己创建的工具,也可以储存别人造的工具,我们在项目中需要使用某种工具时,在pom中声明dependency,编译代码时就会根据dependency去下载工具(Artifact ,供自己使用。

对于自己的项目完成后可以通过mvn install命令将项目放到仓库(Repositories)中

仓库分为本地仓库和远程仓库,远程仓库是指远程服务器上用于存储Artifact的仓库,本地仓库是指本机存储Artifact的仓库,对于windows机器本地仓库地址为系统用户的.m2/repository下面。

对于需要的依赖,在pom中添加dependency即可,可以在maven的仓库中搜索: http://mvnrepository.com/

 

2.4 Build Lifecycle

是指一个项目build的过程。maven的Build Lifecycle分为三种,分别为 default(处理项目的部署)、 clean(处理项目的清理)、 site(处理项目的文档生成)。他们都包含不同的 lifecycle

Build Lifecycle是由 phases构成的,下面重点介绍default Build Lifecycle几个重要的phase

Xml代码   收藏代码
  1. validate 验证项目是否正确以及必须的信息是否可用  
  2. compile 编译源代码  
  3. test 测试编译后的代码,即执行单元测试代码  
  4. package 打包编译后的代码,在target目录下生成package文件  
  5. integration-test 处理package以便需要时可以部署到集成测试环境  
  6. verify 检验package是否有效并且达到质量标准  
  7. install 安装package到本地仓库,方便本地其它项目使用  
  8. deploy 部署,拷贝最终的package到远程仓库和替他开发这或项目共享,在集成或发布环境完成<span style="white-space: normal; background-color: #ffffff;"> </span>  

以上的phase是有序的(注意实际两个相邻phase之间还有其他phase被省略,完整phase见 lifecycle ),下面一个phase的执行必须在上一个phase完成后

若直接以某一个phase为goal,将先执行完它之前的phase,如mvn install

将会先validate、compile、test、package、integration-test、verify最后再执行install phase

 

2.5 Goal

goal代表一个特定任务

Xml代码   收藏代码
  1. A goal represents a specific task (finer than a build phase) which contributes to the building and managing of a project.  

mvn package表示打包的任务,通过上面的介绍我们知道,这个任务的执行会先执行package phase之前的phase

mvn deploy表示部署的任务

mven clean install则表示先执行clean的phase(包含其他子phase),再执行install的phase。

 

3、maven用法

主要讲下Archetype以及几种常用项目的创建

maven创建项目是根据Archetype(原型)创建的。下面先介绍下Archetype

3.1 Archetype

原型对于项目的作用就相当于模具对于工具的作用,我们想做一个锤子,将铁水倒入模具成型后,稍加修改就可以了。

类似我们可以根据项目类型的需要使用不同的Archetype创建项目。通过Archetype我们可以 快速标准的创建项目。利用Archetype创建完项目后都有 标准的文件夹目录结构

既然Archetype相当于模具,那么当然可以自己再造模具了啊, 创建Archetype

下面介绍利用 maven自带的集中Archetype创建项目。创建项目的goal为mvn archetype:generate,并且指定archetypeArtifactId,其中archetypeArtifactId见 maven自带的archetypeArtifactId

 

3.2 quick start工程

创建一个简单的quick start项目,指定  -DarchetypeArtifactId为maven-archetype-quickstart,如下命令

Xml代码   收藏代码
  1. mvn archetype:generate -DgroupId=com.trinea.maven.test -DartifactId=maven-quickstart -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false  

其中DgroupId指定groupId,DartifactId指定artifactId,DarchetypeArtifactId指定ArchetypeId,

DinteractiveMode表示是否使用交互模式,交互模式会让用户填写版本信息之类的,非交互模式采用默认值

这样我们便建好了一个简单的maven项目,目录结构如下:


现在我们可以利用2.4的build Lifecycle进行一些操作,先命令行到工程根目录下

编译 mvn  compile

打包 mvn package,此时target目录下会出现maven-quickstart-1.0-SNAPSHOT.jar文件,即为打包后文件

打包并安装到本地仓库mvn install,此时本机仓库会新增maven-quickstart-1.0-SNAPSHOT.jar文件。

 

3.3 web工程

创建一个简单的web项目,只需要修  -DarchetypeArtifactId为maven-archetype-webapp即可,如下命令

Java代码   收藏代码
  1. mvn archetype:generate -DgroupId=com.trinea.maven.web.test -DartifactId=maven-web -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false  

 

其他:

src\main\resources文件夹是用来存放资源文件的,maven工程默认没有resources文件夹,如果我们需要用到类似log4j.properties这样的配置文件,就需要在src\main文件夹下新建resources文件夹,并将log4j.properties放入其中。

test需要用到资源文件,类似放到src\test下

对于apache的log4j没有log4j.properties文件或是目录错误,会报如下异常

Xml代码   收藏代码
  1. log4j:WARN No appenders could be found for logger (org.apache.commons.httpclient.HttpClient).  
  2. log4j:WARN Please initialize the log4j system properly.  

 

4、maven常用参数和命令

主要介绍maven常用参数和命令以及简单故障排除

 

4.1 mvn常用参数

mvn -e 显示详细错误

mvn -U 强制更新snapshot类型的插件或依赖库(否则maven一天只会更新一次snapshot依赖)

mvn -o 运行offline模式,不联网更新依赖

mvn -N仅在当前项目模块执行命令,关闭reactor

mvn -pl module_name在指定模块上执行命令

mvn -ff 在递归执行命令过程中,一旦发生错误就直接退出

mvn -Dxxx=yyy指定java全局属性

mvn -Pxxx引用profile xxx

 

4.2 首先是2.4 Build L ifecycle中介绍的命令

mvn test-compile 编译测试代码

mvn test 运行程序中的单元测试

 

mvn  compile 编译项目

mvn package 打包,此时target目录下会出现maven-quickstart-1.0-SNAPSHOT.jar文件,即为打包后文件

mvn install 打包并安装到本地仓库,此时本机仓库会新增maven-quickstart-1.0-SNAPSHOT.jar文件。

每个phase都可以作为goal,也可以联合,如之前介绍的mvn clean install

 

 

4.3 maven 日用三板斧

mvn archetype:generate 创建maven项目

mvn package 打包,上面已经介绍过了

mvn package -Prelease打包,并生成部署用的包,比如deploy/*.tgz

mvn install 打包并安装到本地库

mvn eclipse:eclipse 生成eclipse项目文件

mvn eclipse:clean 清除eclipse项目文件

mvn site 生成项目相关信息的网站

 

4.4 maven插件常用参数

mvn -Dwtpversion=2.0 指定maven版本

mvn -Dmaven.test.skip=true 如果命令包含了test phase,则忽略单元测试

mvn -DuserProp=filePath 指定用户自定义配置文件位置

mvn -DdownloadSources=true -Declipse.addVersionToProjectName=true eclipse:eclipse 生成eclipse项目文件,尝试从仓库下载源代码,并且生成的项目包含模块版本(注意如果使用公用POM,上述的开关缺省已打开)

 

4.5 maven简单故障排除

 

mvn -Dsurefire.useFile=false如果执行单元测试出错,用该命令可以在console输出失败的单元测试及相关信息

set MAVEN_OPTS=-Xmx512m -XX:MaxPermSize=256m 调大jvm内存和持久代,maven/jvm out of memory error

mvn -X maven log level设定为debug在运行

mvndebug 运行jpda允许remote debug

mvn --help 这个就不说了。。

 

5、maven扩展

maven常用插件配置和使用

 

6、maven配置

为了修改maven创建项目默认以来的jdk版本,看了下maven配置,可参考 http://www.iteye.com/topic/41612

maven2.0默认使用jdk1.5导致反省、@override 等annotation不可用。可用两种方法修改jdk版本

第一种:修改项目的pom.xml,影响单个项目,治标不治本

Java代码   收藏代码
  1. <build>  
  2.     <plugins>  
  3.         <plugin>  
  4.             <groupId>org.apache.maven.plugins</groupId>  
  5.             <artifactId>maven-compiler-plugin</artifactId>  
  6.             <configuration>  
  7.                 <source>1.6</source>  
  8.                 <target>1.6</target>  
  9.                 <encoding>UTF-8</encoding>  
  10.             </configuration>  
  11.         </plugin>  
  12.     </plugins>  
  13. </build>  

pom中增加build配置,指定java版本为1.6

 

第二种:修改maven配置,影响maven建立的所有项目

到maven安装目录的conf文件夹下,修改settings.xml文件,如下:

Java代码   收藏代码
  1. <profiles>     
  2.        <profile>       
  3.             <id>jdk-1.6</id>       
  4.             <activation>       
  5.                 <activeByDefault>true</activeByDefault>       
  6.                 <jdk>1.6</jdk>       
  7.             </activation>       
  8.             <properties>       
  9.                 <maven.compiler.source>1.6</maven.compiler.source>       
  10.                 <maven.compiler.target>1.6</maven.compiler.target>       
  11.                 <maven.compiler.compilerVersion>1.6</maven.compiler.compilerVersion>       
  12.             </properties>       
  13.     </profile>      
  14. </profiles>   

这样便能对所有默认的maven项目指定jdk为1.6

 

参考资料:

Maven官方文档: http://maven.apache.org/guides/index.html

Maven权威指南: http://www.sonatype.com/books/maven-book/reference_zh/public-book.html

maven安装: http://maven.apache.org/download.html

http://www.infoq.com/cn/search.action?queryString=maven%E5%AE%9E%E6%88%98&searchOrder=relevance&search=maven%E5%AE%9E%E6%88%98

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [maven 核心 概念] 推荐:

Maven 3 入门 -- 核心概念

- - 开源软件 - ITeye博客
例如上篇helloworld的pom.xml配置文件中的. 其实就是坐标,那么Maven的坐标元素包括groupId、artifactId、version、packaging、classifier. 当一个项目通过依赖,插件或者父项目引用与另外一个项目关联的时候,Maven通过坐标来精确定位一个项目.

maven用途、核心概念、用法、常用参数和命令、扩展

- - 互联网 - ITeye博客
本文由浅入深,主要介绍 maven的用途、 核心概念(Pom、Repositories、Artifact、Build Lifecycle、Goal)介绍、 用法( Archetype意义及 创建各种项目)、 maven 常用参数和命令 以及简单故障排除 、maven扩展(eclipse、cobertura、findbugs、插件开发)、 maven配置.

Storm核心概念剖析

- - 互联网 - ITeye博客
最近团队中有分析的场景,用到了JStorm来做数据的实时分析,于是花时间对于一些概念做了了解. 这个的话出来应该有几年时间了,阿里巴巴也重写了一套JStorm,核心的类名都是服用的Storm的,他是一套实时数据处理系统,容错行好,然后足够稳定,目前很多数据实时分析的场景,选择Storm的越来越多了.

Hyperledger Fabric 核心概念

- - 陶陶技术博客
区块链是一个透明的,基于不可变模式的去中心化系统,核心就是一个分布式账本,记录网络上发生的所有交易. 区块链网络主要有三种类型:公共区块链、联盟区块链,以及私有区块链;我们熟知的比特币、以太坊这些数字货币其实就是属于公共区块链平台;. 而今天要介绍的 Fabric 则是属于联盟链类型的;Fabric是一个企业级的分布式账本技术平台,也是目前应用最广泛的区块链项目.

maven学习之maven与eclipse集成

- - ITeye博客
    在上一篇博文中讲到了maven的配置,今天要讲maven与eclipse的集成. 现在在java开发中,eclipse占据了绝大部分的市场份额. 其他的关于NetBeans,IDEA中的关于maven的配置,读者可参阅相关资料. (注:关于IDEA,据说是款非常强大的集成开发环境,但是据说对svn的支持不是很好,道听途说而已).

十分钟带你理解Kubernetes核心概念 - DockOne.io

- -
Kubernetes的核心概念. 因为这些定义可以在Kubernetes的文档中找到,所以文章也会避免用大段的枯燥的文字介绍. 相反,我们会使用一些图表(其中一些是动画)和示例来解释这些概念. 我们发现一些概念(比如Service)如果没有图表的辅助就很难全面地理解. 在合适的地方我们也会提供Kubernetes文档的链接以便读者深入学习.

程序员必知的 89 个操作系统核心概念

- - IT瘾-dev
☞【干货】 嵌入式驱动工程师学习路线☞【干货】 一个可以写到简历的Linux物联网综合项目☞【干货】 Linux嵌入式知识点-思维导图-免费获取☞【干货】 我的新书《从零开始学ARM》正式上线. 来自:Java 建设者. 操作系统(Operating System,OS):是管理计算机硬件与软件资源的系统 软件,同时也是计算机系统的 内核与基石.

maven工程下整合spring+mybatis+freemarker

- - CSDN博客架构设计推荐文章
博客地址:http://zhengyinhui.com/?p=142. 由于工作主要是前端开发,做后端的项目比较少,最近自己做个项目,发觉好多的都忘了,这里写篇博客整理下maven工程下整合spring+mybatis+freemarker相关内容. 新建个Archetype为maven-archetype-webapp的maven项目(安装maven插件:http://download.eclipse.org/technology/m2e/releases),在pom文件添加相关依赖:.

Maven最佳实践:划分模块

- - 企业架构 - ITeye博客
“分天下为三十六郡,郡置守,尉,监” —— 《史记·秦始皇本纪》. 所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml. 它们之间通过继承和聚合(也称作多模块,multi- module)相互关联. 我们明明在开发一个项目,划分模块后,导入Eclipse变成了N个项目,这会带来复杂度,给开发带来 不便.

从Maven仓库中导出jar包

- - 企业架构 - ITeye博客
从Maven仓库中导出jar包:进入工程pom.xml 所在的目录下,. 输入以下命令:mvn dependency:copy-dependencies -DoutputDirectory=lib. 更简单的  mvn dependency:copy-dependencies    会导出到target\dependency 下面.