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.pswp.cn/news/537104.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537104.shtml
英文地址,請注明出處:http://en.pswp.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;很多教程里的地址是不對的 新地址安…