最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Maven分模塊開發(fā)與依賴管理和聚合和繼承及屬性深入詳細(xì)介紹

 更新時間:2022年10月13日 11:58:57   作者:懶羊羊.java  
依賴管理是項目管理中非常重要的一環(huán)。幾乎任何項目開發(fā)的時候需要都需要使用到庫。而這些庫很可能又依賴別的庫,這樣整個項目的依賴形成了一個樹狀結(jié)構(gòu),而隨著這個依賴的樹的延伸和擴(kuò)大,一系列問題就會隨之產(chǎn)生

前言

對于復(fù)雜龐大的項目,maven的熟練使用可以大大提高工作效率

分模塊開發(fā)

開發(fā)的模塊可以獨立出來,作為一個資源,當(dāng)需要使用時可以通過依賴的形式來引用

1.1 分模塊開發(fā)理念

將原始模塊按照功能拆分成若干個子模塊,方便模塊間的相互調(diào)用,接口共享。這樣的話,項目中的每一層都可以單獨維護(hù),也可以很方便的被別人使用

1.按照功能拆分

為了避免項目中某一個模塊代碼出現(xiàn)問題,導(dǎo)致整個項目無法正常啟動,我們會按照功能將項目進(jìn)行拆分

2.按照模塊拆分

為了提高代碼復(fù)用性

可以將公共的部分抽取成一個獨立的模塊,其他模塊要想使用可以像添加第三方j(luò)ar包依賴一樣來使用我們自己抽取的模塊,這樣就解決了代碼重復(fù)的問題(比如訂單用戶)

1.2 分模塊開發(fā)實現(xiàn)

建立依賴關(guān)系

maven01項目的pom.xml添加maven03的依賴

<dependency>
    <groupId>ppgoodlike.yu7daily</groupId>
    <artifactId>maven03</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

在IDEA中是有maven03這個項目,所以我們只需要將maven03項目安裝到本地倉庫即可,將需要被依賴的項目maven03,使用maven的install命令,把其安裝到Maven的本地倉庫中。否則會出現(xiàn)編譯錯誤!

2.依賴管理

2.1 依賴傳遞與沖突問題

(1) A依賴了B和C,B和C有分別依賴了其他jar包,所以在A項目中就可以使用上面所有jar包,這就是所謂的依賴傳遞

(2) 依賴傳遞有直接依賴和間接依賴

直接依賴:在當(dāng)前項目中通過依賴配置建立的依賴關(guān)系

間接依賴:被資源的資源如果依賴其他資源,當(dāng)前項目間接依賴其他資源

  • 相對于A來說,A直接依賴B和C,間接依賴了D1,E1,G,F(xiàn),D2和E2
  • 相對于B來說,B直接依賴了D1和E1,間接依賴了G
  • 直接依賴和間接依賴是一個相對的概念

(3)因為有依賴傳遞的存在,就會導(dǎo)致jar包在依賴的過程中出現(xiàn)沖突問題,具體什么是沖突?Maven是如何解決沖突的?

這里所說的依賴沖突是指項目依賴的某一個jar包,有多個不同的版本,因而造成類包版本沖突。

情況一: 在maven01的pom.xml中添加兩個不同版本的Junit依賴:

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
</dependencies>

特殊優(yōu)先:當(dāng)同級配置了相同資源的不同版本,后配置的覆蓋先配置的。

情況二:

路徑優(yōu)先:當(dāng)依賴中出現(xiàn)相同的資源時,層級越深,優(yōu)先級越低,層級越淺,優(yōu)先級越高

  • A通過B間接依賴到E1
  • A通過C間接依賴到E2
  • A就會間接依賴到E1和E2,Maven會按照層級來選擇,E1是2度,E2是3度,所以最終會選擇E1

情況三:

聲明優(yōu)先:當(dāng)資源在相同層級被依賴時,配置順序靠前的覆蓋配置順序靠后的

  • A通過B間接依賴到D1
  • A通過C間接依賴到D2
  • D1和D2都是兩度,這個時候就不能按照層級來選擇,需要按照聲明來,誰先聲明用誰,也就是說B在C之前聲明,這個時候使用的是D1,反之則為D2

2.2 可選依賴和排除依賴

為了解決依賴的版本沖突問題,通??梢噪[藏對外的資源關(guān)系

方案一:可選依賴

可選依賴指對外隱藏當(dāng)前所依賴的資源—不透明

maven04的pom.xml,在引入maven03的時候,添加optional

<dependency>
    <groupId>ppgoodlike.yu7daily</groupId>
    <artifactId>maven03</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--可選依賴是隱藏當(dāng)前工程所依賴的資源,隱藏后對應(yīng)資源將不具有依賴傳遞-->
    <optional>true</optional>
</dependency>

方案二:排除依賴

排除依賴指主動斷開依賴的資源,被排除的資源無需指定版本—不需要

前面我們已經(jīng)通過可選依賴實現(xiàn)了阻斷maven03的依賴傳遞,對于排除依賴,則指的是已經(jīng)有依賴的事實,也就是說maven01項目中已經(jīng)通過依賴傳遞用到了maven03,此時我們需要做的是將其進(jìn)行排除,所以接下來需要修改maven01的pom.xml

<dependency>
    <groupId>ppgoodlike.yu7daily</groupId>
    <artifactId>maven04</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--排除依賴是隱藏當(dāng)前資源對應(yīng)的依賴關(guān)系-->
    <exclusions>
        <exclusion>
            <groupId>ppgoodlike.yu7daily</groupId>
            <artifactId>maven03</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  • A依賴B,B依賴C,C通過依賴傳遞會被A使用到,現(xiàn)在要想辦法讓A不去依賴C
  • 可選依賴是在B上設(shè)置<optional>,A不知道有C的存在,
  • 排除依賴是在A上設(shè)置<exclusions>,A知道有C的存在,主動將其排除掉。

3.聚合和繼承 

3.1 聚合

1.所謂聚合:將多個模塊組織成一個整體,同時進(jìn)行項目構(gòu)建的過程稱為聚合

2.聚合工程:通常是一個不具有業(yè)務(wù)功能的"空"工程(有且僅有一個pom文件)

使用聚合工程可以將多個工程編組,通過對聚合工程進(jìn)行構(gòu)建,實現(xiàn)對所包含的模塊進(jìn)行同步構(gòu)建

當(dāng)工程中某個模塊發(fā)生更新(變更)時,必須保障工程中與已更新模塊關(guān)聯(lián)的模塊同步更新,此時可以使用聚合工程來解決批量模塊同步構(gòu)建的問題。

聚合具體的實現(xiàn)步驟為:

<?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>ppgoodlike.yu7daily</groupId>
    <artifactId>maven01</artifactId>
    <version>1.0-RELEASE</version>
    <packaging>pom</packaging>
    <!--設(shè)置管理的模塊名稱-->
    <modules>
        <module>../maven01</module>
        <module>../maven03</module>
        <module>../maven04</module>
    </modules>
</project>

測試發(fā)現(xiàn),當(dāng)maven01compile被點擊后,所有被其管理的項目都會被執(zhí)行編譯操作。這就是聚合工程的作用。

聚合工程管理的項目在進(jìn)行運行的時候,會按照項目與項目之間的依賴關(guān)系來自動決定執(zhí)行的順序和配置的順序無關(guān)。

最后總結(jié)一句話就是,聚合工程主要是用來管理項目。

3.2 繼承

所謂繼承:描述的是兩個工程間的關(guān)系,與java中的繼承相似,子工程可以繼承父工程中的配置信息,常見于依賴關(guān)系的繼承

將所有項目公共的jar包依賴提取到父工程的pom.xml中,子項目就可以不用重復(fù)編寫,簡化開發(fā)

將所有項目的jar包配置到父工程的dependencyManagement標(biāo)簽下,實現(xiàn)版本管理,方便維護(hù)

注:dependencyManagement標(biāo)簽不真正引入jar包,只是管理jar包的版本,子項目在引入的時候,只需要指定groupId和artifactId,不需要加version

注:當(dāng)dependencyManagement標(biāo)簽中jar包版本發(fā)生變化,所有子項目中有用到該jar包的地方對應(yīng)的版本會自動隨之更新

最后總結(jié)一句話就是,父工程主要是用來快速配置依賴jar包和管理項目中所使用的資源。

實現(xiàn)步驟:

1.創(chuàng)建Maven模塊,設(shè)置打包類型為pom

<packaging>pom</packaging>

2.在父工程的pom文件中配置依賴關(guān)系(子工程將沿用父工程中的依賴關(guān)系),一般只抽取子項目中公有的jar包

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.10.RELEASE</version>
    </dependency>
    ...
</dependencies>

3.在父工程中配置子工程中可選的依賴關(guān)系

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>ppgoodlike.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.16</version>
        </dependency>
    </dependencies>
    ...
</dependencyManagement>

4.在子工程中配置當(dāng)前工程所繼承的父工程

<!--定義該工程的父工程-->
<parent>
    <groupId>ppgoodlike.yu7daily</groupId>
    <artifactId>maven01</artifactId>
    <version>1.0-RELEASE</version>
    <!--填寫父工程的pom文件,可以不寫-->
    <relativePath>../maven01/pom.xml</relativePath>
</parent>

5.在子工程中配置使用父工程中可選依賴的坐標(biāo)

<dependencies>
    <dependency>
        <groupId>ppgoodlike.alibaba</groupId>
        <artifactId>druid</artifactId>
    </dependency>
</dependencies>

注意事項:

1.子工程中使用父工程中的可選依賴時,僅需要提供群組id和項目id,無需提供版本,版本由父工程統(tǒng)一提供,避免版本沖突

2.子工程中還可以定義父工程中沒有定義的依賴關(guān)系,只不過不能被父工程進(jìn)行版本統(tǒng)一管理。

3.3 聚合VS繼承

兩種之間的作用:

  • 聚合用于快速構(gòu)建項目,對項目進(jìn)行管理
  • 繼承用于快速配置和管理子項目中所使用jar包的版本

聚合和繼承的相同點:

  • 聚合與繼承的pom.xml文件打包方式均為pom,可以將兩種關(guān)系制作到同一個pom文件中
  • 聚合與繼承均屬于設(shè)計型模塊,并無實際的模塊內(nèi)容

聚合和繼承的不同點:

  • 聚合是在當(dāng)前模塊中配置關(guān)系,聚合可以感知到參與聚合的模塊有哪些
  • 繼承是在子模塊中配置關(guān)系,父模塊無法感知哪些子模塊繼承了自己

4.屬性

為了解決更新多個jar包的版本,而出現(xiàn)漏改導(dǎo)致程序出問題,可以聲明一個變量,在其他地方使用該變量,當(dāng)變量的值發(fā)生變化后,所有使用變量的地方,就會跟著修改,以spring、junit、mybatis-spring為例

4.1 定義父工程屬性

<properties>
    <spring.version>5.2.10.RELEASE</spring.version>
    <junit.version>4.12</junit.version>
    <mybatis-spring.version>1.3.0</mybatis-spring.version>
</properties>

4.2 修改依賴的version

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring.version}</version>
</dependency>

5.配置文件加載屬性

為了讓maven管理范圍更大,我們可以在父工程中定義屬性通過配置文件引用的方式來完成配置

5.1 父工程定義屬性

<properties>
   <jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url>
</properties>

5.2 jdbc.properties文件中引用屬性

在jdbc.properties,將jdbc.url的值直接獲取Maven配置的屬性

jdbc.driver=ppgoodlike.mysql.jdbc.Driver
jdbc.url=${jdbc.url}
jdbc.username=root
jdbc.password=284650

5.3 設(shè)置maven過濾文件范圍

Maven在默認(rèn)情況下是從當(dāng)前項目的src\main\resources下讀取文件進(jìn)行打包。現(xiàn)在我們需要打包的資源文件是在maven01下,需要我們通過配置來指定下具體的資源目錄

<build>
    <resources>
        <!--設(shè)置資源目錄-->
        <resource>
            <directory>../maven01/src/main/resources</directory>
            <!--設(shè)置能夠解析${},默認(rèn)是false -->
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

directory路徑前要添加../的原因是maven01相對于父工程的pom.xml路徑是在其上一層的目錄中,所以需要添加。

到此這篇關(guān)于Maven分模塊開發(fā)與依賴管理和聚合和繼承及屬性深入詳細(xì)介紹的文章就介紹到這了,更多相關(guān)Maven分模塊開發(fā)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Java適配器模式

    詳解Java適配器模式

    這篇文章主要介紹了Java適配器模式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java中保證多線程間的數(shù)據(jù)共享的方法詳解

    Java中保證多線程間的數(shù)據(jù)共享的方法詳解

    這篇文章詳解的發(fā)給大家介紹了Java中是如何保證多線程間的數(shù)據(jù)共享的,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-11-11
  • Intellij IDEA遠(yuǎn)程debug教程實戰(zhàn)和要點總結(jié)(推薦)

    Intellij IDEA遠(yuǎn)程debug教程實戰(zhàn)和要點總結(jié)(推薦)

    這篇文章主要介紹了Intellij IDEA遠(yuǎn)程debug教程實戰(zhàn)和要點總結(jié)(推薦),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • SpringBoot工程中Spring Security應(yīng)用實踐記錄流程分析

    SpringBoot工程中Spring Security應(yīng)用實踐記錄流程分析

    Spring Security是一個能夠為基于Spring的企業(yè)應(yīng)用系統(tǒng)提供聲明式的安全訪問控制解決方案的安全框架。這篇文章主要介紹了SpringBoot工程中Spring Security應(yīng)用實踐,需要的朋友可以參考下
    2021-09-09
  • java編程實現(xiàn)求解八枚銀幣代碼分享

    java編程實現(xiàn)求解八枚銀幣代碼分享

    這篇文章主要介紹了java編程實現(xiàn)求解八枚銀幣代碼分享,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java日期格式化的實現(xiàn)(@JsonFormat和@JSONField)

    Java日期格式化的實現(xiàn)(@JsonFormat和@JSONField)

    本文主要介紹了Java日期格式化的實現(xiàn),主要介紹了@JsonFormat和@JSONField兩種方式,具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • Java并發(fā)編程中的生產(chǎn)者與消費者模型簡述

    Java并發(fā)編程中的生產(chǎn)者與消費者模型簡述

    這篇文章主要介紹了Java并發(fā)編程中的生產(chǎn)者與消費者模型簡述,多線程并發(fā)是Java編程中最終要的部分之一,需要的朋友可以參考下
    2015-07-07
  • Spring?異步接口返回結(jié)果的四種方式

    Spring?異步接口返回結(jié)果的四種方式

    這篇文章主要介紹了Spring?異步接口返回結(jié)果的四種方式,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-08-08
  • 多線程Thread,Runnable,Callable實現(xiàn)方式

    多線程Thread,Runnable,Callable實現(xiàn)方式

    這篇文章主要為大家詳細(xì)介紹了Java多線程如何實現(xiàn)Thread,Runnable,Callable的方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Java 實現(xiàn)模擬用戶登錄的示例代碼

    Java 實現(xiàn)模擬用戶登錄的示例代碼

    這篇文章主要介紹了Java 實現(xiàn)模擬用戶登錄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11

最新評論

泸溪县| 南阳市| 安塞县| 荆州市| 彰武县| 仁化县| 南充市| 同德县| 松江区| 嵊州市| 余干县| 垫江县| 灵台县| 海门市| 天镇县| 岢岚县| 九台市| 晋中市| 长阳| 太仓市| 延寿县| 呼和浩特市| 会理县| 深泽县| 崇文区| 太仆寺旗| 壶关县| 宁武县| 朝阳市| 遵义县| 岳西县| 榆树市| 汉源县| 沅陵县| 巴彦县| 马关县| 邻水| 屯留县| 武冈市| 大丰市| 京山县|