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,一经查实,立即删除!

相关文章

idea 导入svn代码_idea导入svn项目

起初和导入git项目一样&#xff0c;file - new - project from version control - &#xff0c;这后面选 subversion。在打开的 checkout from subversion对话框中&#xff0c;输入svn地址&#xff0c;比如 svn://11.22.33.44/demo。添加一个后&#xff0c;展开新加项&#xff…

由mysql8降级到mysql5

最近在研究liferay的使用。liferay可以连接mysql数据库。电脑中装的mysql的最新版本是mysql8。于是开始按照liferay的要求进行连接。但是多番尝试后&#xff0c;均报错&#xff1a;java.sql.SQLException: java.lang.ClassCastException: java.math.BigInteger cannot be cast …

tf计算矩阵维度_tensorflow中关于 多维tensor的运算(tf.multiply, tf.matmul, tf.tensordot)...

multiply 等同与* &#xff0c;用于计算矩阵之间的element-wise 乘法&#xff0c;要求矩阵的形状必须一致(或者是其中一个维度为1)&#xff0c;否则会报错&#xff1a;import tensorflow as tfa tf.constant([1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12], shape[2, 3, 2])b tf.con…

Maven高级之插件开发

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

HTTP1.1新增了五种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 、 CONNECT

200 &#xff08;成功&#xff09; 服务器已成功处理了请求。 通常&#xff0c;这表示服务器提供了请求的网页。 201 &#xff08;已创建&#xff09; 请求成功并且服务器创建了新的资源。 202 &#xff08;已接受&#xff09; 服务器已接受请求&#xff0c;但尚未处…

katalon进行app测试_Katalon API 测试 Demo

为何选择Katalon符合我们当下的情况&#xff0c;测试需要借助现有工具提高测试效率以及提高测试质量&#xff1b;为何不自己写代码&#xff1f;不是只有自己写的框架才是最好的&#xff0c;合适的才是最好的&#xff1b;katalon 支持ui、mobile、api 同时也支持脚本模式&#x…

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

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

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

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

cesium面积计算_cesium-长度测量和面积测量

(更新)多谢网友的提醒&#xff0c;面积测量的小问题已经修改&#xff0c;经测试可正常使用网上找的大神的实现方法有点问题&#xff0c;实现有一些bug&#xff0c;作为cesium新手一个&#xff0c;弃之不忍&#xff0c;只好硬着头皮修改了&#xff0c;不过还好问题不大&#xff…

SpringBoot自动配置原理流程

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

算法:对象方式数组去重

var arr [3, 1, 1, 4 , 2 , 4 , 2 , 4 , 2, 1, 1, 3, 3, 3];var ary[];var obj{};for(var i0;i<arr.length;i){var curarr[i];if(!obj[cur]){obj[cur]cur;ary.push(cur);}}console.log(ary); 复制代码

python实现路由功能_python 实现重启路由器

有一些服务&#xff0c;需要动态IP&#xff0c;所以我们用重启路由器的方法实现。人工重启不可选&#xff0c;用定时脚本执行即可。贴代码&#xff0c;每种路由器&#xff0c;提示不一样。需要路由器有telnet功能才行。#!/usr/bin/env python# -*- coding: utf-8 -*-import tel…

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

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

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

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

raidrive安装失败_记一次RaiDrive映射OneDrive遇到的问题

大概在1周以前&#xff0c;出于需要存放直播录像的原因&#xff0c;根据别人的视频教程去自己动手搞了个5T网盘的帐号。(体验一下&#xff0c;其实我还同时存一份在百度云&#xff0c;怕不稳定)用RaiDrive创建OneDrive的映射&#xff0c;在这步骤点确定后&#xff0c;会弹出微软…

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

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

Javascript基础之-原型(prototype)

首先呢&#xff0c;prototype是对象里的一个内置属性&#xff0c;并且呢&#xff0c;这个属性是对于其他对象的一个引用。所以呢&#xff0c;思考下面的例子&#xff1a; var obj {a: 2 } var myObj Object.create(obj); console.log(myObj.a); // 2 console.log(myObj obj)…

Oracle查询今天、昨天、本周、上周、本月、上月数据

查询今天数据&#xff1a; SELECT COUNT(1) FROM T_CALL_RECORDS WHERE TO_CHAR(T_RKSJ,YYYY-MM-DD)TO_CHAR(SYSDATE,YYYY-MM-DD)&#xff1b; 查询昨天数据&#xff1a; SELECT COUNT(1) FROM T_CALL_RECORDS WHERE TO_CHAR(T_RKSJ,YYYY-MM-DD)TO_CHAR(SYSDATE-1,YYYY-MM-DD)&…

usb一转多 树莓派zero_树莓派 Zero USB/以太网方式连接配置教程

树莓派 Zero 之所以成为一款非常棒的单板计算机并不全因为它小巧的尺寸和便宜的价格&#xff0c;还得益于它便捷、易用的特性。在加装了 Zero Quick Plug 或 microUSB/USB 转换头之后&#xff0c;将树莓派 Zero 和电脑连接起来。树莓派 Zero 即可配置成 USB/以太网设备&#xf…

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;很多教程里的地址是不对的 新地址安…