Maven 3 入门 -- 核心概念

标签: maven 核心 概念 | 发表时间:2014-11-22 06:48 | 作者:kanglecjr
出处:http://www.iteye.com

坐标

例如上篇helloworld的pom.xml配置文件中的

 

 

<groupId>com.zhaoyang</groupId>
<artifactId>HelloWorld</artifactId>
<version>1.0-SNAPSHOT</version>

 

 

 

其实就是坐标,那么Maven的坐标元素包括groupId、artifactId、version、packaging、classifier

当一个项目通过依赖,插件或者父项目引用与另外一个项目关联的时候,Maven通过坐标来精确定位一个项目。

 

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

建这个项目的组织名称的逆向域名开头。

 

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

version:  定义项目的版本

packaging:打包方式,比如:jar或者war,默认是jar

classifier: 表示构建的jdk版本,我们不能直接定义

 

 

---------------------------------------------------------------------------------------------------------------

我们把开始的HelloWorld项目安装到本地仓库,运行 mvn clean install

那么现在去本地仓库目录下查看那个项目,我们就可以理解坐标在仓库中的构成

如下图:



 注:maven的坐标并不只是指一个对应的jar文件,而是包括它的依赖等,我们通过坐标可以精确地定位到这个maven项目。

Maven的生命周期(Life Cycle)

什么是生命周期?

生命周期是指我们对项目的清理,初始化,编译,测试,打包,集成测试,验证,部署,站点生产等等一系列的流程,但是每个公司都是用不同的方式来做这些同样的事情,那么Maven它就给我们把这些过程(称为构建过程)进行了抽象和统一

 

Maven有三套独立的生命周期,它们分别是clean , default,  site

 

1) clean    生命周期是用于清理项目 (默认是删除 target 文件夹)

 

2) default  生命周期是用于构建项目

 

3) site     生命周期是用于建立项目站点

clean生命周期

pre-clean 清理之前的准备
clean 进行清理工作,通常是删除target文件夹
post-clean 清理之后的准备工作

 

default生命周期
validate 验证项目是否正确,以及所有为了完整构建必要的信息是否可用
initialize 初始化
generate-sources 生成所有需要包含在编译过程中的源代码
process-sources 处理源代码,比如过滤一些值
generate-resources 生成所有需要包含在打包过程中的资源文件
process-resources 处理并复制资源文件至目标目录,准备打包
compile 编译项目的源代码
process-classes 处理编译生成的文件,例如对Java类进行字节码增强
generate-test-sources 生成所有包含在测试编译过程中的测试源码
process-test-sources 处理测试源码,比如过滤一些值
generate-test-resources 生成测试需要的资源文件
process-test-resources 处理并复制测试资源文件至测试目标目录
test-compile 编译测试源码至测试目标目录
process-test-classes 处理编译生成的文件,例如对Java类进行字节码增强
test 使用合适的单元测试框架运行测试,这些测试应该不需要代码被打包或发布
prepare-package 在打包之前,执行一些必要的准备操作
package 将编译好的代码打包成可分发的格式,如JAR,WAR,或者EAR
pre-integration-test 执行一些在集成测试运行之前需要的动作,如建立集成测试需要的环境
integration-test 如果有必要的话,处理包并发布至集成测试可以运行的环境
post-integration-test 执行一些在集成测试运行之后需要的动作,如清理集成测试环境。
verify 执行所有检查,验证包是有效的,符合质量规范
install 安装包至本地仓库,以备本地的其它项目作为依赖使用
deploy 复制最终的包至远程仓库,共享给其它开发人员和项目

 

site生命周期
pre-site  
site  
post-site  
site-deploy  

注:在每个生命周期的不同阶段,如果执行了后面阶段,前面的就会自动执行

比如我们执行 

mvn clean 就相当于执行了 pre-clean 以及 clean

mvn test  就相当于执行了 validate --> initialize --> … -->compile-->…--->test

仓库

在Maven世界中,任何一个依赖、插件或者项目的构建输出,都可以称为构件。任何一个构件都有一组坐标唯一标识。

 

得益于坐标机制,任何Maven项目使用任何一个构件的方式都是完全相同的。在此基础上,Maven可以在某个位置统一存储所有Maven项目共享的构件,这个统一的位置就是仓库。

 

对于Maven来说,仓库只分为两大类:本地仓库和远程仓库。当Maven根据坐标寻找构件的时候,它首先会查看本地仓库,如果本地仓库存在此构件,则直接使用;如果本地仓库不存在此构件,Maven就会去远程仓库查找,发现需要的构件之后,下载到本地仓库再使用。

依赖管理(maven最强大的特性)

什么是依赖管理(Dependency Management)?

 

简单地说,比如我们的java项目一般都是会依赖其他的包,在maven的世界里,这些被依赖的包被称为 dependency,就如开头我们在配置文件中配置的一样,而 dependency又是其他工程的坐标。

 

依赖的传递性( Transitive Dependencies

 

在Maven中一个依赖不仅仅是一个JAR。它是一个POM文件,这个POM可能也声明了对其它构件的依赖。这些依赖的依赖叫做 传递性依赖,Maven仓库不仅仅存贮二进制文件,也存储了这些构建的元数据( metadata

 

比如假如你的项目依赖于一个库,而这个库又依赖于五个或者十个其它的库(就像Spring或者Hibernate那样)。你不必找出所有这些依赖然后把它们写在你的pom.xml里,你只需要加上你 直接依赖的那些库,Maven会隐式地把这些库间接依赖的库也加入到你的项目中。Maven也会处理这些依赖中的冲突,同时能让你自定义默认行为,或者排除一些特定的传递性依赖

 

Maven也提供了不同的依赖范围(dependency scope),比如我们上个项目配置的JUNIT

<dependency>

            <groupId>junit</groupId>

            <artifactId>junit</artifactId>

            <version>4.7</version>

            <scope>test</scope>

</dependency>

 其中的scope为test就是说明只有在运行测试编译的时候才会加入到classpath中

 

注:

当为项目创建JAR文件的时候,它的依赖不会被捆绑在生成的构件中,它们只是用来编

译。当用Maven来创建WAR或者EAR,你可以配置Maven让它在生成的构件中捆绑依赖,

你也可以配置Maven,使用provided范围,让它排除WAR文件中特定的依赖。provided范

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

开发web应用的时候provided范围变得十分有用,你需要通过Servlet API来编译你的代

码,但是你不希望Servlet API的JAR文件包含在你web应用的WEB-INF/lib目录中。

 

来源: http://www.cnblogs.com/zhaoyang/archive/2012/01/07/2315451.html



已有 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的越来越多了.

maven学习之maven与eclipse集成

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

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

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

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 下面.

简单的Maven模块结构

- - 研发管理 - ITeye博客
简单的Maven模块结构是这样的:. 上述简单示意图中,有一个父项目(app-parent)聚合很多子项目(app-util, app-dao, app-service, app-web). 每个项目,不管是父子,都含有一个pom.xml文件. 而且要注意的是,小括号中标出了每个项目的打包类型. 父项目是pom,也只能是pom.

maven导出项目依赖的jar包

- - 互联网 - ITeye博客
在进行项目部署时,需要将maven项目所依赖的jar导出到指定目录,本文讲解如何导出项目依赖的jar包. 一、导出到默认目录 targed/dependency .     从Maven项目中导出项目依赖的jar包:进入工程pom.xml 所在的目录下,执行如下命令:.        或在eclipse中,选择项目的pom.xml文件,点击右键菜单中的Run As,见下图红框中,在弹出的Configuration窗口中,输入  dependency:copy-dependencies 后,点击运行.