Maven之pom.xml常用标签解析及镜像配置

前言

Maven仅仅是个打包工具而已,个人觉得没有太大必要花费在打包工具上,这里就列举一下个人觉得会常用标签的使用就好了,原理啥的基本就不太会去深度了解了,如果以后遇到需了解Maven工作原理的工作的话,到时候一定分享出来。

pom结构

前面那篇博客已经展示过了,这里就在展示一下,官网上也有文档可以查看,链接:Maven官网pom.xml

parent标签

这个标签用的最多是在使用Spring Boot项目以及父子项目的用的最多,

SpringBoot示例:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.15.RELEASE</version>
</parent>

父子项目示例:

 这里module标签意思就是该父项目有哪些模块的意思,值为子模块的文件夹的名称,而不是artifactId,不然找不到对应的子模块,而且在父模块中的packaging标签值为pom,表示这是一个父类项目。

坐标

Maven中坐标是Jar包的唯一标识,在pom.xml中指定坐标的标签元素包括:groupId,artifactId,version,packaging

元素描述说明
groupId定义当前模块隶属的实际Maven项目中小企业常常直接对应公司/组织
artifactId定义实际项目中的一个模块唯一标识一个模块
version定义当前项目所在的版本SNAPSHOT 表示不稳定的版本。
LATEST 指最新发布的版本,可能是个发布版,也可能是一个snapshot版。
RELEASE 指最后一个发布版。
packaging定义Maven项目打包方式有jar(默认)、war、pom(表示为父模块)、maven-plugin(当前项目为插件)等.
classifier附属构件(如javadoc、sources)须有附加插件的帮助

properties属性标签

这个标签里面可自定义标签属性,也可覆盖默认标签属性,示例:

<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring.version>5.1.16.RELEASE</spring.version>
</properties>
....
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency>
</dependencies>

自定义属性可以在maven的生命周期中使用,最常用的就是在default-resources中使用,用来替换properties文件中的${}值。

Maven自己会有一些内置属性:

${basedir} 项目根目录
${project.build.directory} 构建目录,缺省为target
${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes
${project.build.finalName} 产出物名称,缺省为${project.artifactId}-${project.version}
${project.packaging} 打包类型,缺省为jar
${project.xxx} 当前pom文件的任意节点的内容

dependency依赖标签

这个标签下放的就是当前项目依赖jar的坐标。

如果我想引入一下MySQL的驱动包:

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version><scope>compile</scope>
</dependency>

这里有个依赖作用域scope,一般有以下依赖范围

  • compile:默认范围,用于编译,依赖的jar在打包时会包含进去      
  • provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath,依赖的jar在打包时不会包含进去 
  • runtime:在执行时需要使用,依赖的jar在打包时会包含进去
  • test:用于test任务时使用,依赖的jar在打包时不会包含进去
  • system:需要外在提供相应的元素。通过systemPath来取得,一般该作用域用来引入外部jar包

在使用system作用域的时候,使用systemPath标签指定外部元素路径,如:

<systemPath>${project.basedir}/lib/sdk-1.0.jar</systemPath>//项目根路径下

在依赖标签里面还有一个标签属性optional:该标签默认值为false指的是父子项目之间的是否传递(之前在看Mybatis源代码的时候,下载下来后的pom.xml里面就会有这个标签),如果父项目引入一个依赖并且optional标签设置为true的话,那么子项目打包的时候也会打包进去,如果设置为false的话,那么就不会打包进去。

依赖冲突解决:

在引入依赖的时候会存在一个问题,就是依赖传递,如果在项目中引入多个重复的依赖,那么jvm只能拿到一个版本的依赖,其他的版本的依赖就会被抛弃,所以Maven在处理这个上是有一定的顺序的,先看一下示例:

如果有个项目pom.xml引入fastjson包的依赖如下:

 则取舍规则如下:

1、路径最短原则:productcustomer里的fastjson引用路径较短,路径为两步 ;pay项目里的fastjson引用路径较长,路径为三步。因此pay中的fastjson被淘汰;

2、同路径长度下,谁先声明谁优先: productcustomer中的fastjson路径相同,那么就看在pom中是先声明product还是先声明customer,谁先用谁的。

profiles标签

主要应用的场景:开发环境和测试环境的配置是不一致的,为了打包方便,一般我们会将配置文件的写在一个properties文件中,如下:

在打包的时候指定是测试环境还是开发环境进行不同的打包,实现这样的一个功能就是使用profiles标签了,先将两种不同环境的数据录入到profiles标签中,如下所示(activeByDefault为默认配置):

 此定义即指,当mvn命令执行时,我们需要通过加上 -P dev或者-P test方式传入我们的需要指定的profile的id:dev/test选择,会导致properties里的变量值含义不同,这个操作需要在build标签中添加一个资源复制:

dependencyManagement标签

这个标签是作为版本号管理使用的,基本上都是用于父项目中,定义好全局统一的版本号,在子项目中就只需要引入groupId以及artifactId了,在SpringBoot的父模块中就是使用的这个作为统一管理的。

build标签

该标签主要是用来打包时做一些处理功能,像资源文件的复制,选择指定的插件以及最终打包的jar包名称等。

finalName

当前应用工程打包的jar名称

pluginManagement标签

当前标签和dependencyManagement的作用是一致,在父模块当中定义好版本号,在子模块当中直接引用即可

plugin标签

当前标签为插件标签,在上篇博文当中已经提到了Maven生命周期中对应的执行插件有哪些,而插件也是一个jar包,所以引入也是需要通过坐标进行引入的,示例如上。

后面我会发布一篇博客专门讲解Maven插件的。

distributionManagement

该标签是在Maven的deploy阶段,即将当前项目推送到远程私服的仓库上,以供于他人使用,一般比较大型的公司都会有自己的私服仓库,公司内部自己也会开发一些组件啥的,开发完之后需推送到公司的私服仓库当中,私服后面我也会有一片博客讲解这个东西,在推送的过程中也可以指定推送哪种类型的仓库

 还有两种常用的标签:repositoriespluginRepositories,用法如下:

repositories:即指定当前项目依赖引入jar使用的仓库地址,如果在Maven的settings.xml中指定好镜像仓库和依赖仓库后,这里其实是可以不需要指定的,但是如果某些项目需要的依赖仓库不在settings.xml的配置文件里面,可以在pom.xml中手动指定仓库。

pluginRepositories:即指定当前项目插件依赖引入jar使用的仓库地址。功能同上。

mirrors

还有个settings.xml里面的镜像标签需要提一下,Maven仓库镜像是会拦截所有只想仓库的路径,转向到镜像当中的仓库,即如果没有配置镜像的话,那么Maven下载依赖包会直接去远程中央仓库中下载,而如果配置了镜像,那么就会被镜像拦截,转发到镜像指定的仓库下载依赖,和镜像标签一起使用的还有mirrorOf标签,该标签是可以指定哪些仓库可以被镜像拦截

<!--匹配所有仓库请求,即将所有的仓库请求都转到该镜像上-->
<mirrorOf>*</mirrorOf> <!--将仓库jcenter和repo2的请求转到该镜像上,使用逗号分隔多个远程仓库。 -->
<mirrorOf>jcenter,repo1</mirrorOf> <!--匹配所有仓库请求,jcenter除外,使用感叹号将仓库从匹配中排除。-->
<mirrorOf>*,!jcenter</miiroOf> <!-- settings.xml中的仓库 -->
<repository><id>jcenter</id><url>https://jcenter.bintray.comt</url>
</repository>
<repository><id>repo1</id><url>https://repo1.maven.org/maven2</url>
</repository>

下面列举一些镜像地址:


<!-- 阿里云的镜像站--><mirror><id>nexus-aliyun</id><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> 
</mirror>
<!-- maven官方运维仓库 -->
<mirror> <id>repo2</id> <name>Mirror from Maven Repo2</name> <url>http://repo2.maven.org/maven2/</url> <mirrorOf>central</mirrorOf> 
</mirror>
<!-- maven在UK架设的仓库-->
<mirror> <id>ui</id> <name>Mirror from UK</name> <url>http://uk.maven.org/maven2/</url> <mirrorOf>central</mirrorOf> 
</mirror>
<!-- JBoss的仓库 -->
<mirror> <id>jboss-public-repository-group</id> <mirrorOf>central</mirrorOf> <name>JBoss Public Repository Group</name> <url>http://repository.jboss.org/nexus/content/groups/public</url> 
</mirror>

Maven不仅仅是以上的那些标签属性,在此只是列出来个人觉得平常使用的比较多的标签。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537104.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven高级之插件开发

前言 终于来到了Maven的插件开发&#xff0c;其实Maven的插件并没有想象的那么难&#xff0c;刚开始讲Maven基础的时候就演示了一下JDK是如何打包的&#xff0c;Maven打包只是在JDK打包上封装了一层而已&#xff0c;Maven也支持自定义插件开发 创建 我们先使用quickstart原型…

Maven高级之archetype(原型/骨架)开发

前言 archetype这个的主要功能就是将写好的项目模块打包成一个原型&#xff0c;然后提供给其他人使用&#xff0c;这样别人就可以快速使用这个项目模板了。 这个东西虽然很多人都基本用不上&#xff0c;但原型这个东西用的好还是很方便的&#xff0c;能够在开发新项目上省去大…

深度学习在搜索业务中的探索与实践

本文根据美团高级技术专家翟艺涛在2018 QCon全球软件开发大会上的演讲内容整理而成&#xff0c;内容有修改。引言 2018年12月31日&#xff0c;美团酒店单日入住间夜突破200万&#xff0c;再次创下行业的新纪录&#xff0c;而酒店搜索在其中起到了非常重要的作用。本文会首先介绍…

SpringBoot自动配置原理流程

前言 新公司太忙了&#xff0c;都没啥空更新博客&#xff0c;就随便记录一下以前的学习笔记吧。SpringBoot是基于Spring上的衍生框架&#xff0c;只要看懂了Spring的话&#xff0c;学这个就比较简单了&#xff1b;SpringBoot也是在当前微服务时代下流行的框架&#xff0c;并且…

SpringBoot自定义Starter(自动配置类)

前言 SpringBoot其实从诞生以来围绕的核心就是快速构建项目&#xff0c;快速构建的前提是有人帮你做好轮子&#xff0c;开发者只要拿来即用就好了&#xff0c;而造好轮子的人就是SpringBoot的开发者&#xff0c;引入自动配置的形式帮助开发者快速创建项目&#xff0c;而自动配…

Java并发编程之synchronized关键字解析

前言 公司加班太狠了&#xff0c;都没啥时间充电&#xff0c;这周终于结束了。这次整理了Java并发编程里面的synchronized关键字&#xff0c;又称为隐式锁&#xff0c;与JUC包中的Lock显示锁相对应&#xff1b;这个关键字从Java诞生开始就有&#xff0c;称之为重量级锁&#xf…

通过代理模式 + 责任链模式实现对目标执行方法拦截和增强功能

前言 最近需要实现一个插件功能&#xff0c;但是如果做成两个接口的话&#xff08;即执行前和执行后&#xff09;&#xff0c;那么会降低插件的可玩性&#xff0c;所以需做成类似AOP的环绕通知形式&#xff0c;所以就使用到了责任链模式和代理模式进行实现。 介绍 代理模式(P…

vscode Go 1.11.4 编译错误 need Delve built by Go 1.11 or later

更新golang的版本为1.11.4之后vscode编译错误&#xff1a;executables built by Go 1.11 or later need Delve built by Go 1.11 or later 原因是delve的版本太老了&#xff0c;需要更新&#xff0c;且delve的github地址已经更换&#xff0c;很多教程里的地址是不对的 新地址安…

Navicat使用教程:使用Navicat Query Analyzer优化查询性能(第1部分)

下载Navicat Monitor最新版本Navicat Monitor 是一套安全、简单而且无代理的远程服务器监控工具。它具有强大的功能使你的监控发挥最大效用。受监控的服务器包括 MySQL、MariaDB 和 Percona Server&#xff0c;并与 Amazon RDS、Amazon Aurora、Oracle Cloud、Microsoft Azure …

第一家云创大数据产业学院在佛山职业技术学院挂牌

2019年1月10日&#xff0c;“云创大数据产业学院揭牌暨战略合作协议签署仪式”在佛山职业技术学院电子信息学院会议室举行。云创大数据总裁刘鹏教授、市场部经理单明月&#xff0c;佛山职业技术学院电子信息学院院长唐建生、副院长田钧、学院办公室主任赵雪章、信息工程系主任乔…

String与StringBuffer和StringBuilder的根本区别

*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更…

前端Http协议缓存初解

[TOC] 简介 用户获取网络资源&#xff0c;需要通过非常长的网络去服务器上请求资源,另外服务端为了应对大量的用户请求而不断的提升硬件性能与带宽。这对用户与服务端都非常的不友好。而缓存就是为了解决用户请求速度与释放服务器压力而生的。 为什么我会写Http缓存&#xff0c…

详解java访问修饰符

*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更…

企业为什么要做SEO,它的重要性有哪些?

对于SEO工作而言&#xff0c;我们知道一个网站做SEO的基础诉求就是让用户和搜索引擎更好的理解网站内容&#xff0c;虽然随着搜索引擎算法技术的迭代&#xff0c;目前SEO面临更大的挑战与竞争&#xff0c;但基于搜索营销&#xff0c;它目前仍然显得十分重要。 那么&#xff0…

白话说编程之java线程

白话说编程之java线程线程和进程&#xff1a;进程&#xff1a;线程&#xff1a;线程和进程的区别&#xff1a;详解多线程:并发为什么使用并发并发的执行原理并行线程的五种状态&#xff1a;创建状态&#xff1a;就绪状态&#xff1a;运行状态&#xff1a;阻塞状态&#xff1a;死…

powerdesigner显示工具面板_photoshop教程-画笔工具预设与选项设置

定义画笔预设在打开的“画笔”面板中&#xff0c;单击左侧的“画笔笔尖形状”名称&#xff0c;可显示笔尖形状图案。单击“画笔”面板左侧其他不同的选项名称&#xff0c;在右侧就会显示其对应的调节项。只单击不同选项前面的方框&#xff0c;可使此选项有效&#xff0c;但右侧…

深入理解== 和 equals 的区别

深入理解 和 equals 的本质区别简介区别&#xff1a;图解&#xff1a;注意点&#xff1a;源码分析&#xff1a;总结分享一波:程序员赚外快-必看的巅峰干货简介 初学者常常被" “和‘equals ’所折磨&#xff0c;为什么&#xff0c;因为他们的大概意思相同&#xff0c;都是…

java sleep和wait区别

为什么80%的码农都做不了架构师&#xff1f;>>> 关于sleep和wait区别解析&#xff1a; sleep只是释放CPU资源&#xff0c;并不释放资源锁对象&#xff0c;wait是会释放掉资源锁对象。 比如&#xff0c;有个锁对象object&#xff0c;线程1和线程2都会锁住object对象…

深入理解equals和hashCode关系和区别

深入理解equals和hashCode关系和区别直入主题&#xff1a;区别&#xff1a;1.他们判断对象相同的方式不一样&#xff1a;2.他们判断对象是否相等的准确率不一样&#xff1a;改写equals时总是要改写hashcode分享一波:程序员赚外快-必看的巅峰干货为什么要说equals和hashCode这两…