Apache Maven的入门使用之常用操作以及核心概念介绍(2)
我们接着上篇文章,来继续介绍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.org和uk.maven.org maven的中心库等。另外一些比如公司内部搭建的库,用于内部分享相对隐私的数据。我们可以通过maven安装目录下,conf目录中的settings.xml来对远程仓库的地址进行配置。具体的配置说明可以参考官方的文档,或者settings.xml的注释部分。这里就不多讲了。
本地仓库的位置在用户家目录下一个.m2的隐藏文件夹,然后里边有个repository的目录,比如我这里:
比如web container插件jetty:
我们可以在自己的项目编译好之后将其部署到我们本地的库中,我们在我们的项目目录中(pom.xml)所在的目录执行 mvn install。
如果有远成仓库的上传权限,我们也可以将做好的项目上传至远程仓库。
Apache Maven的入门使用之常用操作以及核心概念介绍(2)的更多相关文章
- Apache Maven的入门使用之项目的基本构建(1)
前言 最近在研究java框架struts2的相关漏洞,然后就去看了官方给出的文档.在看文档的过程中发现使用到了Apache Maven这个项目管理工具,我在网上搜索了一下,大多数文章都写得不是很系统, ...
- Apache Maven从入门到升天
喜欢就点个赞呗! GitHub项目JavaHouse同步收录 1 引入 在日常 Java 开发中,Maven 应该是必不可少的一个工具了,当然也有人使用 Gradle 的.那么 Maven 究竟是个啥 ...
- ElasticSearch入门及核心概念介绍
Elasticsearch研究有一段时间了,现特将Elasticsearch相关核心知识和原理以初学者的角度记录下来,如有不当,烦请指正! 0. 带着问题上路——ES是如何产生的? (1)思考:大 ...
- Maven入门-2.Maven一些核心概念介绍
1.Maven仓库2.Maven坐标3.Maven插件和目标4.Maven生命周期4.1 clean:清理项目4.2 default:构建项目(重要)4.3 site:建立项目站点 1.Maven仓库 ...
- kubernetes入门(04)kubernetes的核心概念(1)
一.ReplicationController/ReplicaSet 在Kubernetes集群中,ReplicationController能够确保在任意时刻,指定数量的Pod副本正在运行.如果Po ...
- kubernetes入门(07)kubernetes的核心概念(4)
一.pod 二.Volume volume可以为容器提供持久化存储,比如 三.私有镜像 在使用私有镜像时,需要创建一个docker registry secret,并在容器中引用.创建docker r ...
- kubernetes入门(06)kubernetes的核心概念(3)
一.API 对象 API对象是K8s集群中的管理操作单元.K8s集群系统每支持一项新功能,引入一项新技术,一定会新引入对应的API对象,支持对该功能的管理操作.例如副本集Replica Set对应的A ...
- kubernetes入门(05)kubernetes的核心概念(2)
一.使用 kubectl run 创建 pod(容器) 命令 kubectl run类似于 docker run,可以方便的创建一个容器(实际上创建的是一个由deployment来管理的Pod): 等 ...
- 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 ...
随机推荐
- [SoapUI]怎样获取上一个Test Step的名字
def currentStepInd = context.currentStepIndex def previousStep = testRunner.testCase.getTestStepAt(c ...
- 10个实用的UX设计作品推销小窍门
以下内容由Mockplus(摹客)团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 众所周知,产品用户体验很重要,即使是Google也知道这一点.但是,当真正涉及到UX 设计销 ...
- 拒绝枯燥,有意思的 Loading 页面动效设计
互联网时代,网络“提速”日益频繁,人们打开Web或软件的速度越来越快,一般页面缓冲和加载地过程也是几不可查.然而,在某些情况下,例如软件急需加载大量页面,首页急需加载大量内容,用户下载文件过大,甚至是 ...
- Android使用ListView使用方法
Android使用ListView应该注意的地方 在ListView中设置Selector为null会报空指针? mListView.setSelector(null);//空指针 试试下面这种: ...
- git和码云的使用
什么是码云 快速入门 Git入门 码云是开源中国社区2013年推出的基于 Git 的完全免费的代码托管服务,这个服务是基于 Gitlab 开源软件所开发的,我们在 Gitlab 的基础上做了大量的改进 ...
- Linux的磁盘分区(三)
RAID 廉价冗余磁盘阵列 Redundant Arrays of Inexpensive Disks 不同级别的RAID功能.特性各不相同 对比项 RAID0 RAID1 RAID10 RAID5 ...
- swift UITabelVIew - 纯代码自定义tabelViewCell
// // CustomTableViewCell.swift // tab // // Created by su on 15/12/7. // Copyright © 2015年 tian ...
- IntelliJ IDEA 2016.1.3(64) license server 与汉化
license server:http://idea.iteblog.com/key.php 汉化:将resources_cn.jar 复制到安装IDEA安装目录下的lib文件夹中.重新打开即可. r ...
- mysql数据表简单拷贝及重命名
CREATE TABLE to LIKE from;//拷贝结构 RENAME TABLE from TO to;//重命名
- C-sharp精华面试题
注:红色表示答案 一.选择,填空题 1. 在ADO.NET中,对于Command对象的ExecuteNonQuery()方法和ExecuteReader()方法,下面叙述错误的是(C). a) ...