在使用Maven的过程中,经常会遇到几个核心的概念,准确的理解这些概念将会有莫大的帮助。

1. POM(Project Object Model)项目对象模型

POM 与 Java 代码实现了解耦,当需要升级版本时,只需要修改POM,而不需要更改Java代码,而在POM稳定后,日常的Java代码开发基本不涉及POM的修改。

2. 坐标

groupId , artifactId , version 三个元素是项目的坐标,唯一的标识这个项目。

groupId 项目所在组,一般是组织或公司,artifactId 是当前项目在组中的唯一ID; version 表示版本,SNAPSHOT表示快照,表示此项目还在开发中,不稳定。

groupId 和实际项目不一定是一一对应的,maven 有模块的概念,例如 spring-core, spring-context...;groupId 也不应该只对应公司或组织名,建议具体到项目名,因为公司或者组织下有多个项目,而artifactId只能代表模块名。

3. 依赖

传递性依赖可能带来一些问题,例如两个依赖的版本不兼容,依赖SNAPSHOT可能会导致项目的不稳定问题,依赖的jar包由于版权问题无法使用等等问题,此时,就需要在dependency中用exclusion 排除依赖,然后引入合适的依赖,exclusion中只需提供groupId 和 artifactId 即可。

Maven解决依赖冲突的两个原则:

1. 最短路径(高优先级)

2. 最先声明

几个scope的有效范围:

1. compile : 编译,测试,运行都有效,默认的选择

2. test : 测试有效,例如junit

3. provided : 编译,测试有效,例如 servlet ,运行时容器会提供实现

4. runtime : 运行和测试有效,例如 jdbc,编译时只需相应的接口,测试和运行时才需要具体的实现

5. system : 编译,测试有效。使用此范围的依赖必须通过systemPath元素显式的指定依赖文件,因而

 此类依赖是不通过Maven仓库解析的,一般适合于本机测试环境下,依赖本地起的服务。

6. import(2.0.9 以上):

4. 聚合与继承

聚合:仅仅是为了聚合其他模块,这样就不用每个模块分别去执行MVN命令了,其本身并没有实质性内容,注意其打包方式必须为pom

<moduls>

  <modul> m1</modul>

  <modul> m2</modul>

  <modul> m3</modul>

</moduls>

继承:

parent pom 用 <DependencyManagement> 声明依赖以提高灵活性,其中声明的依赖并不会实际引入实际的依赖,此时子pom继承后的<dependency>就可以只写groupId 和 artifactId ,其他细节 parent pom中已经声明过了。

聚合是为了快速的构建项目,而继承是为了避免重复配置。但两者的打包方式都必须为pom

5. 快照

A 和 B 合作开发,B 开发的模块依赖A开发的模块,A 发布时version设为快照,例如 2.1-SNAPSHOT,再发布过程中,maven会自动给此版本打上时间戳,B 依赖于此快照版本,当B构建项目时,Maven会自动根据时间戳检查最新版本,并更新。快照版本应该仅在组织内部的项目或者模块间使用;正式发布时,要记得改为正式版本

6. 生命周期

三套独立的生命周期(clean, default, site),每个周期都包含一些阶段。

  clean的三个阶段:
1.pre-clean:执行一些清理前需要完成的工作
2.clean 清理上一次构建生成的文件
3. post-clean 执行一些清理后需要完成的工作
  default的一些关键阶段:
1. process-sources: 处理项目主资源文件,一般是将src/main/resources 目录的内容进行变量替换等工作后,复制到项目输出的主classpath目录中。
2. compile 编译项目的主源码
3. process-test-sources: 处理项目测试资源文件
4. test-compile 编译项目的测试代码
5. test 进行测试
6. package 接受编译好的代码,打包成可发布的格式,例如jar
7. install 将包安装到Maven本地仓库,供本地其他Maven项目使用
8. deploy 将最终的包复制到远程仓库
  site 生命周期
1. pre-site 2. site 3. post-site 4.site-deploy

相对应得几个常用命令 mvn clean; mvn test; mvn clean compile; mvn clean install

Maven常用的几个核心概念的更多相关文章

  1. Maven学习总结(21)——Maven常用的几个核心概念

    在使用Maven的过程中,经常会遇到几个核心的概念,准确的理解这些概念将会有莫大的帮助. 1. POM(Project Object Model)项目对象模型 POM 与 Java 代码实现了解耦,当 ...

  2. Maven介绍,包括作用、核心概念、用法、常用命令、扩展及配置

    由浅入深,主要介绍maven的用途.核心概念(Pom.Repositories.Artifact.Build Lifecycle.Goal).用法(Archetype意义及创建各种项目).maven常 ...

  3. [转]Maven介绍,包括作用、核心概念、用法、常用命令、扩展及配置

    转自:http://www.trinea.cn/android/maven/ 两年半前写的关于Maven的介绍,现在看来都还是不错的,自己转下.写博客的一大好处就是方便自己以后查阅,自己总结的总是最靠 ...

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

    设置问题解决. http://trinea.iteye.com/blog/1290898 本文由浅入深,主要介绍maven的用途.核心概念(Pom.Repositories.Artifact.Buil ...

  5. Maven笔记之核心概念及常用命令

    Maven的核心概念 Maven是一款服务于java平台的自动化构建工具. 自动化构建工具还有:make->ant->maven->gradle       1.约定的目录  2.P ...

  6. Maven的几个核心概念

    POM (Project Object Model) 一个项目所有的配置都放置在 POM 文件中:定义项目的类型.名字,管理依赖关系,定制插件的行为等等.比如说,你可以配置 compiler 插件让它 ...

  7. (转)Maven学习总结(四)——Maven核心概念

    孤傲苍狼只为成功找方法,不为失败找借口! Maven学习总结(四)——Maven核心概念 一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1.2.Mav ...

  8. maven的核心概念

    1 简单的核心概念 1.1 坐标 groupId.artifactId.version,很简单,这三个坐标定位到了该依赖的位置,有了它们就可以下载该依赖了. 1.2 依赖 如果一个jar包使用了另外一 ...

  9. Maven学习总结(4)——Maven核心概念

    Maven学习总结(四)--Maven核心概念 一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1.2.Maven坐标主要组成 groupId:组织标识 ...

随机推荐

  1. vue-router如何根据不同的用户给不同的权限

    闲聊: 小颖去年在上家公司用的vue1.0之前在做路由这块用的router.map,但是现在vue2.0里已经不能用了,所以之前解决权限问题的例子,小颖也参考不了呜呜 之前看一个美女写的:elemem ...

  2. 基于Petri网的工作流分析和移植

    基于Petri网的工作流分析和移植 一.前言 在实际应用场景,包括PEC的订单流程从下订单到订单派送一直到订单完成都是按照一系列预先规定好的工作流策略进行的. 通常情况下如果是采用面向过程的编程方法, ...

  3. JAVA WEBSERVICE服务端&客户端的配置及调用(基于JDK)

    前言:我之前是从事C#开发的,因公司项目目前转战JAVA&ANDROID开发,由于对JAVA的各种不了解,遇到的也是重重困难.目前在做WEBSERVICE提供数据支持,看了网上相关大片的资料也 ...

  4. Linux 中最常用的目录及文件管理命令

    一.查看文件的命令 对于一个文本文件,在linux中有多种查看方式来获知文件内容,如直接显示整个文本内容.分页查看内容.或者只查看文件开头或末尾的部分内容.在linux可以用不同的命令来实现. 1. ...

  5. TortoiseGit使用SSH

    Windows TortoiseGit使用SSH连接 1 找到TortoiseGit自带的Puttygen工具 2.1 如果未生成过SSHKey,选择Generate(生成的过程中记得移动鼠标) 2. ...

  6. Swift计算字符数量

    通过调用全局 countElements 函数并将字符串作为参数进行传递可以获取该字符串的字符数量. let unusualMenagerie = "Koala

  7. Iconfont 矢量图标库的应用

    前言: 在项目开发中,不免在标签栏,工具栏等应用各种各样的小图标. 然后老旧的做法就是要UI设计出各种图标并生成图片给到我们,但是这样就存在了一个问题,每次请求页面的时候就需要发送请求请求图片,这样不 ...

  8. 【项目1-1】使用HTML5+CSS3绘制HTML5的logo

    作为一个WEB小萌新,自学了有一段时间,总是感觉停滞不前.最近反思中,想到前贤一句话:书读百遍其义自见.说到底,还是项目做的少,如果做多了,想必自然会得心应手. 利用HTML5+CSS3绘制HTML5 ...

  9. Socket实现-Socket I/O

    Socket层的核心是两个函数:sosend()和soreceive().这两个函数负责处理所有Socket层和协议层之间的I/O操作. select()系统调用的作用是监控文件描述符的状态.一般用于 ...

  10. laravel中间件使用

    1.在app/Http/Kernel.php文件中配置中间件文件,例如: protected $routeMiddleware = [ 'auth' => \Illuminate\Auth\Mi ...