Maven使用入门

通过上一节的学习,我们已经了解和配置好了Maven,接下来需要编写代码了

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

和Make的Makefile类似,Maven项目的核心是pom.xml,定义了项目的基本信息,描述项目如何构建,声明依赖等

<?xml version="1.0" encoding="UTF-8"?>
<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.0</modelVersion> <groupId>team.kirohuji</groupId>
<artifactId>Test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Test</name>
<packaging>war</packaging>
</project>

这是一个基本的pom.xml文件的内容

groupId,artifactId和version这三行,这三个元素定义了一项目的基本的坐标(Coordinate),

groupId:定义当前Maven项目的实际项目

artifactId:定义实际项目中的一个实际的Maven项目(模块)

version: 当前版本号,直接回车,默认是1.0-SNAPSHOT

packaging:Maven项目的打包方式

name元素声明了一个Maven项目的项目名称,这个不是必要的

classifier:用来帮助定义构建输出的一些附属构件,不能直接定义项目的classifier,因为附属构件不是项目直接默认生成的,而是由附加的插件帮助生成

项目的名称的一般规律也是:artifactId-version [-classifier].packing,[-classifier]表示可选

2.依赖的配置

<?xml version="1.0" encoding="UTF-8"?>
<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>team.kirohuji</groupId>
<artifactId>tset3</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>tset3</name>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

一个依赖一般可以包含以下一些元素

<project>
...
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>... </artifactId>
<version>...</version>
<type>...</type>
<scope>...</scope>
<optional>...</optional>
<exelusions>
<exclusion>
...
</exclusion>
...
</exelusions>
</dependency>
</dependencies>

groupId,artifactId和version:依赖的坐标

type:依赖的类型,对应项目坐标定义的packing,一般不必声明,其默认值是jar

scope:依赖的范围

optional:标记依赖是否可选

exclusions:用来排除传递性依赖

大部分依赖声明只包含基本坐标即可

(1).依赖的范围

Maven在编译项目主代码的时候需要使用一套classpath,其次Maven在编译和执行测试的时候会使用另一套calsspath

依赖范围就是用来控制这三种classpath(编译,测试,运行)的关系,Maven有以下几种依赖范围:

a.  compile:编译依赖范围,默认使用此依赖范围,使用此依赖,对编译,测试,运行三种classpath都有效

b.  test:测试依赖范围,即对测试classpath有效

c.  provided:已提供依赖范围.对于编译和测试classpath有效,但运行时无效

d.  runtime:运行时依赖范围:使用此依赖范围的Maven依赖,对于测试和运行classpath有效,但在编译主代码时无效

e.  system:系统依赖范围:该依赖和provided依赖范围完全一直,但是,使用system范围的依赖时必须通过systemPath元素显式地指定依赖文件的路径,由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此谨慎使用,systemPath元素可以引用环境变量

f.import(Maven 2.0.9及以上):导入依赖范围

(2).传递性依赖

1.假设 A 依赖 B , B 依赖 C ,我们称 A 对 B 是第一直接依赖, B 对 C 是第二直接依赖, A 对 C 是传递依赖

2.依赖调解:两个原则:路径最近优先原则和第一声明者优先

3.<optional>可以声明是否实现依赖特性true或false

4.排除依赖即使用<exclusions>元素进行配置

5.Maven会自动解析所有项目的直接依赖和传递性依赖,进行一系列的配置,最后得到的那些依赖称为已解析依赖(Resolved Dependency),可以运行

mvn dependency:list

命令查看已解析依赖

3.仓库

Maven通过仓库来统一管理这些文件,在Maven的世界中,任何一个依赖,插件或者项目构建的输出,都可以称为构件,任何一个构建都有唯一的一个坐标,这便是Maven的仓库布局方式,Maven仓库是基于简单文件系统存储的

(1)本地仓库和远程仓库

对于Maven来说,仓库分为两种:本地仓库和远程仓库,首先Maven会根据坐标寻找构件,首先查看本地仓库,如果没有此构件,则会在远程仓库中寻找,有的话,就会下载到本地仓库,还有其它特殊的仓库:中央仓库和私服,其他公共库

(2)本地仓库

在每个用户的目录下都有一个路径名为.m2/repository/仓库路径,可以在~/.m2/settings.xml中设置localRepository元素的值为想要的仓库地址:

<settings>
<localRepository>/home/zyd/Desktop/Repository</localRepository>
</settings>

一般~/.m2/中没有settings.xml的,用户需要从Maven安装目录复制/conf/settings.xml文件到~/.m2/下,再进行文件配置

一个构件只有在本地仓库中之后,才能由其他Maven项目使用,最常见的方式是从远程仓库下载到本地仓库,还有方式是把本地项目的构件安装到Maven仓库中,比如本地项目A在项目中执行

mvn clean instal

首先是清理target文件夹,二进制文件就不需要加入仓库中,然后Install插件的install目标将项目的构建输出文件安装到本地仓库

(3)远程仓库

安装好Maven后,一般本地仓库目录是不存在的,当用户使用了第一条Maven命令之后,Maven才会创建本地仓库,然后根据配置和需要,从远程仓库中下载构件到本地仓库

(4)中央仓库

由于原始的本地仓库是空的,Maven必须知道至少一个可用的远程仓库,才能执行Maven命令,中央仓库就是一个默认的远程仓库,Maven 的安装文件自带了中央仓库的配置,在Maven文件夹的lib里的maven-model-builder-3.5.0.jar,打开访问路径/org/apache/maven/model/pom-4.0.0.xml,文件配置如下:

 <repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>

包括这段配置的文件是所有Maven项目都会继承的超级POM

(5)私服

私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用

(6)远程仓库的配置

很多时候,默认的中央仓库无法满足项目的需求,可能项目需要的构件存于另外一个远程仓库,比如JBoss Maven仓库,这时可以在POM中配置该仓库,代码如下:

<project>
...
<repositories>
<repository>
<id>jboss</id>
<name>JBoss Repository</name>
<url>http://repository.jboss.com/maven2/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<layout>default</layout>
</repository>
</repositories>
...
</project>

在repositories元素下,可以使用repository子元素声明一个或多个远程仓库,release和snapshots元素比较重要,它们用来控制Maven对于发布版构件和快照版构件的下载,表示开启JBoss仓库的发布版本下载支持

对于releases和snapshots来说,除了enabled,它们还包含另外两个子元素updatePolicy和checksumPolicy:

<snapshots>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</snapshots>

元素updatePolicy用来配置Maven从远程仓库检查更新的频率,默认的值是daliy,表示Maven每天检查一次,其他的可用值包括:never--从不检查;always--每次构建都检查更新;interval:

X--每隔X分钟检查一次更新(X为任意整数)

元素checksumPolicy用来配置Maven检查检验和文件的策略,checksumPolicy的值默认的warn时,Maven会在执行构建输出警告信息,其他可用的值包括:fail--Maven遇到校验和错误就让构建失败;ignore--使Maven完全忽略校验和错误

(7)远程仓库的认证

大部分远程仓库无须认证就可以访问,但有时候出于安全考虑,我们需要提供认证信息才能访问一些远程仓库,管理员可以为每个仓库提供了一组用户名以及密码,认证是在settings.xml文件中

<settings>
...
<servers>
<server>
<id>my-proj</id>
<username>repo-user</username>
<password>repo-pwd</password>
</server>
</servers>
...
</settings>

Maven使用settings.xml文件中并不显而易见的servers元素以及其server子元素配置仓库认证信息

(8)部署至远程仓库

私服的一大作用是部署第三方构件,包括组织内部生成构件以及一些无法从外部仓库直接获取的构件,无论是日常开发中生成的构件,还是证实版本发布的构件,都需要部署到仓库中,供其他团队成员使用.Maven除了能对项目进行编译,测试,打包之外,还能将项目生成的构建部署到仓库中,首先,需要编辑项目的pom.xml文件,配置distributionManagement元素

<project>
...
<distributionManagement>
<repository>
<id>proj-releases</id>
<name>Proj Release Repository</name>
<url>http://192.168.1.100/content/repositories/proj-releases</url>
</repository>
<snapshotRepository>
<id>proj-snapshots</id>
<name>Proj Snapshot Repository</name>
<url>http://192.168.1.100/content/repositories/proj-snapshots</url>
</snapshotRepository>
</distributionManagement>
...
</project>

前者表示发布版本构件的仓库,后者表示快照版本的仓库,配置完成

mvn clean deploy

Maven就会将项目构件部署到配置对应的远程仓库,如果项目当前的版本是快照版本,则会部署到快照版本仓库地址

(9)镜像

如果仓库A可以提供仓库B存储的所有内容,那么就可以认为A是B的一个镜像,就是任何一个可以从仓库A获得的构件,都能从它的镜像中获得,比如中央仓库和国内仓库的镜像,由于地理位置的因素,该镜像往往能够提供比中央仓库更快的服务,因此可以配置Maven使用该镜像来代替中央仓库,编辑settings.xml

<settings>
...
<mirrors>
<mirror>
<id>maven.net.cn</id>
<name>one of the central mirrors in China</name>
<url>http://maven.net.cn/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
...
</settings>

该<mirrorOf>的值为central,表示改配置为中央仓库的镜像

Maven系列学习(二)Maven使用入门的更多相关文章

  1. Maven系列学习(一)Maven基本知识

    Maven 简介 1.Maven主要是基于Java平台的项目构建,依赖管理和项目信息 2.Maven是优秀的构建工具,跨平台,消除构建的重复,抽象了一个完整的构建生命周期模型,标准化构建过程 3.管理 ...

  2. Maven学习 二 Maven环境搭建

    第一步:下载Maven并解压 注意选择镜像地址,选择国内的会快点 解压目录 Maven目录分析 bin:含有mvn运行的脚本 boot:含有plexus-classworlds类加载器框架 conf: ...

  3. Maven学习(二)-----Maven启用代理访问

    Maven启用代理访问 如果你的公司正在建立一个防火墙,并使用HTTP代理服务器来阻止用户直接连接到互联网.如果您使用代理,Maven将无法下载任何依赖. 为了使它工作,你必须声明在 Maven 的配 ...

  4. Maven系列学习(三)Maven生命周期和插件

    Maven生命周期和插件 Maven另外的两个核心概念就是生命周期和插件,Maven的生命周期都是抽象的,其实实际行为都是由插件来完成的,生命周期和插件两者协同工作 1.生命周期 Maven的生命周期 ...

  5. 二 MyBatis 从入门到进阶 2 Maven 入门

    1 Maven 的使用 1.1 本地仓库与中央仓库 本地仓库:Window \ Preferences \ Maven \ User Settings \ Local Repository 中央仓库: ...

  6. Maven学习(1) - Maven入门

    home index:http://maven.apache.org/ download:http://maven.apache.org/download.cgi install: http://ma ...

  7. (转)Maven学习总结(二)——Maven项目构建过程练习

    孤傲苍狼 只为成功找方法,不为失败找借口! Maven学习总结(二)——Maven项目构建过程练习 上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化构建项 ...

  8. Maven学习总结--maven入门(一)

    一.Maven的基本概念 Maven(翻译为"专家","内行")是跨平台的项目管理工具.主要服务于基于Java平台的项目构建,依赖管理和项目信息管理.

  9. Maven+SpringMVC+Dubbo 简单的入门demo配置

    转载自:https://cloud.tencent.com/developer/article/1010636 之前一直听说dubbo,是一个很厉害的分布式服务框架,而且巴巴将其开源,这对于咱们广大程 ...

随机推荐

  1. 数据挖掘 workfolw 总结

    个人将数据挖掘的流程简单表示为“ 数据 → 特征 → 模型 ”.   首先,明确问题的性质和任务(分类.回归.聚类.推荐.排序.关联分析.异常检测等): 其次,理解数据(含义.类型.值的范围),并通过 ...

  2. Django重点之url别名

    django重点之url别名[参数名必须是name,格式是name="XXX] 不论后台路径如何进行修改路径,前台访问的路径不变,永远是alias, 这样方便开发 前台根据 {{ url & ...

  3. Linux安装软件-CentOS和Ubuntu介绍

    开发十年,就只剩下这套架构体系了! >>>   不同Linux发行版的软件安装会有不同的方式,其中CentOS安装软件的主要方式是rpm和yum,Ubuntu可以使用apt-get, ...

  4. Vue slot-scope的理解(适合初学者)

    百度上已经有很多的关于slot-scope的文章,但我感觉都是那些以前没学好,又回头学的人,他们都使用了.Vue文件,我觉得有点不适合初学者,所以我就写一篇适合初学者的. 先抛例程: <!DOC ...

  5. python常用模块学习3

    # # dic='{"name":"tang"}' # # f=open("hello",'w') # # f.write(dic) # # ...

  6. tail 显示文件内容尾部

    1.命令功能 tail默认显示文件内容尾部10行. 2.语法格式 tail  option  file 参数说明 参数 参数说明 -n 显示指定行数 -f 实时输出文件变化后追加的数据 -s 监视文件 ...

  7. [Poj2349]Arctic Network(二分,最小生成树)

    [Poj2349]Arctic Network Description 国防部(DND)要用无线网络连接北部几个哨所.两种不同的通信技术被用于建立网络:每一个哨所有一个无线电收发器,一些哨所将有一个卫 ...

  8. 为什么需要bootloader

    本文链接:https://blog.csdn.net/u012351051/article/details/50557899 受单片机和ARM7等小型CPU设备编程思维的影响,开始对嵌入式linux和 ...

  9. hdu 6035:Colorful Tree (2017 多校第一场 1003) 【树形dp】

    题目链接 单独考虑每一种颜色,答案就是对于每种颜色至少经过一次这种的路径条数之和.反过来思考只需要求有多少条路径没有经过这种颜色即可. 具体实现过程比较复杂,很神奇的一个树形dp,下面给出一个含较详细 ...

  10. LeetCode--054--区螺旋矩阵(java)

    给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ...