springboot~封裝依(yi)賴引(yin)用(yong)包jar還是pom,哪(na)種更(geng)規范
將多個(ge)第三方包封裝(zhuang)成(cheng)一(yi)個(ge)項目后(hou),如果你的目的是讓其他開發人員可以(yi)直接引用(yong)這些(xie)依賴,一(yi)般來說有兩種常見的方式:
-
打成JAR包(bao)(bao):將封裝好的(de)(de)(de)項目(mu)編譯打包(bao)(bao)成JAR文(wen)件,其他開發人員(yuan)可以將這個JAR文(wen)件添加到他們的(de)(de)(de)項目(mu)中,并在項目(mu)的(de)(de)(de)構(gou)建工具(比(bi)如Maven)中配置該JAR作為依賴。這樣做的(de)(de)(de)好處是(shi)簡單(dan)直接,其他開發人員(yuan)只需引(yin)入JAR包(bao)(bao)即(ji)可使用你(ni)封裝的(de)(de)(de)功能。
-
打成POM包:將封裝(zhuang)(zhuang)好的項目發布到倉庫中,并提供一個POM文件(jian),其(qi)他開(kai)發人員可以(yi)通過在他們(men)的項目中引入(ru)這(zhe)個POM文件(jian)來獲取(qu)你封裝(zhuang)(zhuang)的依(yi)賴(lai)(lai)(lai)。這(zhe)種方式更符合(he)Maven的依(yi)賴(lai)(lai)(lai)管(guan)理機制,能夠更好地(di)管(guan)理和控(kong)制依(yi)賴(lai)(lai)(lai)版本(ben)、傳遞性依(yi)賴(lai)(lai)(lai)等。
綜合考慮(lv),如果你的(de)封裝項目(mu)只包含依賴(lai)的(de)JAR文件,并(bing)(bing)沒有其他需要特別配置的(de)內容(rong),那么直接打成(cheng)JAR包可能更為簡單;如果你希望(wang)提供更加靈活(huo)和規范的(de)依賴(lai)管(guan)理方式,可以考慮(lv)打成(cheng)POM包并(bing)(bing)發布(bu)到倉庫中。
一,二,三方包
在軟件(jian)開發(fa)中,通常我們(men)將依賴的(de)包分為三方包(Third-party package)、二方包(Second-party package)和(he)一方包(First-party package)。
-
一方包(First-party package):指的(de)是由自(zi)己或者所在(zai)團隊開發的(de)包,也可以理(li)解為(wei)自(zi)己項目內(nei)部的(de)代碼和庫。
-
二方(fang)包(bao)(Second-party package):通常指的是公(gong)司(si)內部(bu)共(gong)(gong)享的、被(bei)多個團隊或項目使用(yong)的包(bao),也可以(yi)稱為內部(bu)共(gong)(gong)享庫(ku)(ku)。這些包(bao)不是公(gong)開發布到(dao)外部(bu)倉庫(ku)(ku)的,而是在組(zu)織(zhi)內部(bu)進行管理和分享。
-
三方包(bao)(Third-party package):指(zhi)的(de)(de)是外部開(kai)發(fa)(fa)者或組織開(kai)發(fa)(fa)并發(fa)(fa)布的(de)(de)可供公開(kai)訪問和(he)使(shi)用的(de)(de)包(bao),比如常(chang)見的(de)(de)Maven中(zhong)央倉庫、JCenter等。開(kai)發(fa)(fa)人員可以通過引入(ru)這些第三方包(bao)來實(shi)現功(gong)能擴(kuo)展或依賴管理(li)。
根據(ju)以上定義,如(ru)果你(ni)(ni)封裝的項目(mu)中包含的是第(di)三方(fang)包(即外部(bu)(bu)開發(fa)者或組織開發(fa)的包),那(nei)么你(ni)(ni)可以選擇將其(qi)(qi)打成JAR包或POM包提供(gong)給其(qi)(qi)他開發(fa)人員使用;如(ru)果封裝的是公(gong)司內部(bu)(bu)共享的包(二(er)方(fang)包),則可以考慮(lv)將其(qi)(qi)作為(wei)內部(bu)(bu)庫(ku)進行管理和分(fen)享。
希望(wang)以上解釋對你有(you)所幫助,如果還有(you)其他問題(ti),請隨時告訴我(wo)!
pom更規范
當我們希望(wang)將hutool,lombok,jax-rs等包(bao)(bao),如(ru)果不希望(wang)其它(ta)開發人員再(zai)引用(yong)這(zhe)些包(bao)(bao),而通過一個二方(fang)包(bao)(bao)引用(yong)它(ta)們,可以(yi)將這(zhe)些三方(fang)包(bao)(bao)寫到pom里,例如(ru)

然后,開發人(ren)員在自(zi)己項目中,可(ke)以直接通過type為pom的(de)形式,引(yin)用(yong)它們,這樣作的(de)好處就(jiu)是,二方依賴包,只負(fu)責(ze)引(yin)用(yong)相同依賴,不與(yu)代碼耦合(he),例如(ru):
<dependency>
<groupId>com.lind</groupId>
<artifactId>test-bom</artifactId>
<version>1.0.0</version>
<type>pom</type>
</dependency>

如果你要使用的二方包里的三方包,只是某些需要,也可以在dependencyManagement中進行導入,通過按需進行真實的引用即可,這時再引用時,則不需要標識version屬性了,例如org.springframework.boot的spring-boot-dependencies就是做這事的(de),幫(bang)助spring管理相關依賴包的(de)版本。
- pom二方包項目
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
xmlns="//maven.apache.org/POM/4.0.0"
xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lind</groupId>
<artifactId>test-bom</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
<dependencies>
<!-- 三方包包裹 -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>4.0.0.Beta5</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.27</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.32</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- 三方包包裹 -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
開發人員在真實(shi)項目中,按需引用(yong)
<dependencyManagement>
<dependencies>
<!--spring boot 版本-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot-dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 二方包 -->
<dependency>
<groupId>com.lind</groupId>
<artifactId>test-bom</artifactId>
<version>1.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
</dependencies>
引(yin)用后(hou),如圖所(suo)示,只有兩個包在依賴列表中,做到了(le)按(an)需引(yin)用
