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 ...
随机推荐
- stl源码分析de练习
// StlTest1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <vector> #include & ...
- winscp 使用root身份登录
参考: https://www.haiyun.me/archives/winscp-sftp-sudo-root.html 一般root账户在服务器上会被禁止ssh,此时普通用户通过sudo执行管理员 ...
- 如何从官网开始 mongo java
http://docs.mongodb.org/ecosystem/drivers/ MongoDB Driver Documentation Getting Started Installation ...
- Windows与Linux相互远程桌面连接
对于远程桌面连接Linux,大家可能会第一时间想到使用VNC,,远程桌面Windows,大家第一时间会想到使用Windows自带的远程桌面.那么有没有办法,使得在Linux中可以远程Windo ...
- c+内存管理机制
内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的 检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存 ...
- delphi跨平台SOCKET--System.Net.Socket
delphi跨平台SOCKET--System.Net.Socket 不知始于DELPHI哪一个版本,姑且始于柏林版吧. 基于此单元的TSocket类,大家可以很方便地封装出自己的服务端和客户端的SO ...
- [leetcode] 6. Balanced Binary Tree
这个题目纠结了一会儿,终于从二叉树转化到AVL了.题目如下: Given a binary tree, determine if it is height-balanced. For this pro ...
- pro2
#include<iostream> double sum(int n,dounle[]) { double array[100]; foe(int i=0;i<100;i++; ...
- 二.jenkins构建自动化任务
1,新建任务 打开jinkens, 选择 [新建] -->[输入要构建的项目名称]-->[构建一个自由风格的软件项目]-->[OK] 2, 配置 根据自己的需要选择配置,如下: 代 ...
- 10-10Linux的文件操作函数以及所需头文件
Linux的基本文件操作函数 Linux通过相应的对文件的IO函数来实现对文件的操作,这些函数通常被称作"不带缓冲的IO",这是因为他们都是通过调用Linux的内核调用来实 ...