我们接着上篇文章,来继续介绍Maven中几个核心的概念:

POM (Project Object Model)
Maven 插件
Maven 生命周期
Maven 依赖管理
Maven 库

POM (Project Object Model)

我们首先来看一下,上篇文章做演示的时候生成的pom.xml文件:

<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.</modelVersion> <groupId>com.test.helloworld</groupId>
<artifactId>helloworld</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging> <name>helloworld</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-</project.build.sourceEncoding>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

在该配置文件中有三个必须写的字段,groupId,artifactId,version。groupId代表组织或者创建团队的名字,通常用域名全称倒过来,比如说Apache maven 官方就是org.apache.maven。artifactId表示项目的唯一名称。version标识项目开发的版本,snapshot通常表示一个项目处于开发阶段。

所有的项目都继承super POM文件,除非有额外的特殊设置。

Maven 生命周期

  项目构建和分发的过程就是一个项目的生命周期。系统内置有三种构建生命周期:default, clean 和 site。default生命周期处理项目部署的问题,clean处理项目的清理问题,site处理项目的站点文档问题。不一一说明了,详细可以参考官方文档中的说明 http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

clean 生命周期中常用的操作:

mvn pre-clean 执行实际项目清理前所需要的流程

mvn clean 用来清理构建阶段产生的文件(删除生成的target目录)

mvn post-clean 执行完成项目清理所需要的流程

default 生命周期常用的操作:

mvn validate 验证项目配置项或者必要的信息是否正确

mvn initialize 初始化构建状态,比如设置属性或者是创建目录

mvn compile 将项目文件进行编译

mvn test 对项目进行单元测试,这个过程不要求项目代码被打包或者是部署(如果代码没有被编译,那么将首先执行compile的过程)

mvn package 将已经编译好的代码打包为分发的格式,比如jar,或者war等

mvn verify 对集成结果进行检查,测试是否满足预期要求

mvn install 将项目安装到自己本地仓库,用作本地其他项目依赖项

mvn deploy 在继承环境或者版本环境中完成,将最终包复制到远程仓库

site 生命周期常用的操作:

mvn pre-site 执行项目生成之前所需要的流程

mvn site 生成项目文档

mvn post-site 执行完成网站所需要的流程,为站点部署做准备

mvn site-deploy 将生成的项目文档上传至指定服务器

Maven 插件

  Maven通过插件实现其功能,整个Maven都是插件的集合。简单来说,插件可以帮助我们创建jar文件,创建war文件,编译文件,进行单元测试等。任何项目中你能够想到的功能都是通过插件来实现的。

Maven依赖管理

  Maven通过pom.xml文件dependency标签来配置整个项目的依赖包,然后所有的dependency标签被放在它的父标签dependencies中组成一个依赖库的集合。比如,

  <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.</version>
<scope>test</scope>
</dependency>
</dependencies>

这里dependency节点中,goupId依旧是组织或者创建团队的名字,artifactId为该插件的名字,version为该插件的版本号。scope为该插件的作用范围。依赖范围用于限制依赖关系传递性,并会影响到各类构建 任务的类文件路径。默认如果配置了该选项,插件将会从http://repo.maven.apache.org/maven2/进行下载。在首次安装的时候我们可以看到download from xxx。

scope有6种可用的配置项:

compile  这是默认的配置选项,编译的依赖关系在所有项目类路径都可用。而且,这些依赖关系被传递到依赖项目。

provided 这个和compile选项很类似,表示在JDK或容器运行时提供依赖关系。 例如,在为Java Enterprise Edition构建Web应用程序时,可以将Servlet API和相关的Java EE API的依赖项设置为范围,因为Web容器提供了这些类。 此作用域仅在编译和测试类路径中可用,不可传递。

runtime 顾名思义,这个配置项是在项目运行时调用依赖插件,而不是编译的时候。

test 这个主要用于测试阶段,对于项目并不是必须不可的。不可传递。

system 与provided类似,除非明确指定包含它的jar文件。

import (Maven 2.0.9+)  只支持在<dependencyManagement>部分的类型pom依赖。 它指示依赖项将被替换为指定POM的<dependencyManagement>部分中的依赖关系的有效列表。 由于它们被替换,因此具有导入范围的依赖关系实际上并不参与限制依赖关系的传递性。

如果有多个子项目有公共的依赖库文件,那么我们可以在其父pom文件中指定,这样子pom直接做继承就好了。详细情况可以参考官方文档:

https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

这里需要注意的是,如果子类依赖包的类型不一样,那么需要在继承之后特别设置type字段。因为依赖寻找的顺序是{groupId, artifactId, type, classifier},在很多情况下我们仅仅需要指定{groupId, artifactId},因为默认情况下type的类型为jar。

Maven 库

  Maven库被分为本地库和远程库,本地库可以看做是安装时远程库的一个副本,还包括本地项目构建时的临时构建工作。远程库指除了本地库以外的其他库,可以通过比如file:// 或者 http:// 协议对文件进行访问下载的。比如一些第三方库,repo.maven.apache.orguk.maven.org maven的中心库等。另外一些比如公司内部搭建的库,用于内部分享相对隐私的数据。我们可以通过maven安装目录下,conf目录中的settings.xml来对远程仓库的地址进行配置。具体的配置说明可以参考官方的文档,或者settings.xml的注释部分。这里就不多讲了。

本地仓库的位置在用户家目录下一个.m2的隐藏文件夹,然后里边有个repository的目录,比如我这里:

比如web container插件jetty:

我们可以在自己的项目编译好之后将其部署到我们本地的库中,我们在我们的项目目录中(pom.xml)所在的目录执行 mvn install。

如果有远成仓库的上传权限,我们也可以将做好的项目上传至远程仓库。

Apache Maven的入门使用之常用操作以及核心概念介绍(2)的更多相关文章

  1. Apache Maven的入门使用之项目的基本构建(1)

    前言 最近在研究java框架struts2的相关漏洞,然后就去看了官方给出的文档.在看文档的过程中发现使用到了Apache Maven这个项目管理工具,我在网上搜索了一下,大多数文章都写得不是很系统, ...

  2. Apache Maven从入门到升天

    喜欢就点个赞呗! GitHub项目JavaHouse同步收录 1 引入 在日常 Java 开发中,Maven 应该是必不可少的一个工具了,当然也有人使用 Gradle 的.那么 Maven 究竟是个啥 ...

  3. ElasticSearch入门及核心概念介绍

      Elasticsearch研究有一段时间了,现特将Elasticsearch相关核心知识和原理以初学者的角度记录下来,如有不当,烦请指正! 0. 带着问题上路——ES是如何产生的? (1)思考:大 ...

  4. Maven入门-2.Maven一些核心概念介绍

    1.Maven仓库2.Maven坐标3.Maven插件和目标4.Maven生命周期4.1 clean:清理项目4.2 default:构建项目(重要)4.3 site:建立项目站点 1.Maven仓库 ...

  5. kubernetes入门(04)kubernetes的核心概念(1)

    一.ReplicationController/ReplicaSet 在Kubernetes集群中,ReplicationController能够确保在任意时刻,指定数量的Pod副本正在运行.如果Po ...

  6. kubernetes入门(07)kubernetes的核心概念(4)

    一.pod 二.Volume volume可以为容器提供持久化存储,比如 三.私有镜像 在使用私有镜像时,需要创建一个docker registry secret,并在容器中引用.创建docker r ...

  7. kubernetes入门(06)kubernetes的核心概念(3)

    一.API 对象 API对象是K8s集群中的管理操作单元.K8s集群系统每支持一项新功能,引入一项新技术,一定会新引入对应的API对象,支持对该功能的管理操作.例如副本集Replica Set对应的A ...

  8. kubernetes入门(05)kubernetes的核心概念(2)

    一.使用 kubectl run 创建 pod(容器) 命令 kubectl run类似于 docker run,可以方便的创建一个容器(实际上创建的是一个由deployment来管理的Pod): 等 ...

  9. d3基础入门一-选集、数据绑定等核心概念

    引入D3 D3下载,本文下载时的版本为6.5.0 mkdir d3.6.5.0 unzip --help unzip d3.zip -d d3.6.5.0/ ls d3.6.5.0/ API.md C ...

随机推荐

  1. PHP语言性能优化——少使用魔术方法

    对以下使用魔术方法和不适用魔术方法运行时间进行比较 使用魔术方法test1.php: <?php /** * 测试类 */ class test { private $name = " ...

  2. linux git server 简易搭建 (ssh访问)

    git的服务器搭建,如果无需权限控制,仅团队内部使用,初始化一个服务器仓库,其他人通过ssh访问这个文件夹即可.如需复杂的管理,建议使用gitlab. yum install git -y id gi ...

  3. SQL group by 分组后,同一组的排序后取第一条

    SELECT * FROM(                SELECT                     [SPID]                    ,[PH1]           ...

  4. Atom 编辑器侧边栏忽略隐藏文件

    设置中配置需要忽略的文件后缀 package中找到treeview,勾选上这个配置就行

  5. UVa 1374 Power Calculus (IDA*或都打表)

    题意:给定一个数n,让你求从1至少要做多少次乘除才可以从 x 得到 xn. 析:首先这个是幂级的,次数不会很多,所以可以考虑IDA*算法,这个算法并不难,难在找乐观函数h(x), 这个题乐观函数可以是 ...

  6. [转载]如何将word文档直接发布到新浪博客

    目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...

  7. RocketMQ服务器监控误区

    请不要监控10912端口 case: result: 监控10912端口会导致HAService异常,新起线程,吃掉内存,无限次监控虚拟机将宕机! 时间上是直接因果关系. 监控10911 和 9876 ...

  8. Shell脚本传递带有空格的参数[摘录自网络]

    参数处理 说明 $# 传递到脚本的参数个数 $* 以一个单字符串显示所有向脚本传递的参数 $$ 脚本运行的当前进程ID号 $! 后台运行的最后一个进程的ID号 $@ 与$#相同,但是使用时加引号,并在 ...

  9. OpenGL中的像素包装理解

    OpenGL中的像素包装理解 像素包装 位图和像素图很少会被紧密包装到内存中.在许多硬件平台上,考虑到性能的原因位图和像素图的每一行的数据会从特殊的字节对齐地址开始.绝大多数编译 器会自动把变量和缓冲 ...

  10. EBS R12 Vision Profile default value - IRC: Geocode Host

    Profile Option Name Site Application Responsibility Server Server Org User IRC: Geocode Host http:// ...