自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Maven入門,讀完這篇就夠了

開發(fā) 項(xiàng)目管理
Maven項(xiàng)目,依賴,構(gòu)建配置,以及構(gòu)件:所有這些都是要建模和表述的對(duì)象。這些對(duì)象通過一個(gè)名為項(xiàng)目對(duì)象模型(Project Object Model, POM)的XML文件描述。

Maven 項(xiàng)目生命周期

Maven從項(xiàng)?的三個(gè)不同的?度,定義了三套?命周期,三套?命周期是相互獨(dú)?的,它們之間不會(huì)相互影響。

圖片圖片

  • 清理?命周期(Clean Lifecycle):該?命周期負(fù)責(zé)清理項(xiàng)?中的多余信息,保持項(xiàng)?資源和代碼的整潔性。?般拿來清空directory(即?般的target)?錄下的?件。
  • 默認(rèn)構(gòu)建?命周期(Default Lifeclyle):該?命周期表示這項(xiàng)?的構(gòu)建過程,定義了?個(gè)項(xiàng)?的構(gòu)建要經(jīng)過的不同的階段。
  • 站點(diǎn)管理?命周期(Site Lifecycle):向我們創(chuàng)建?個(gè)項(xiàng)?時(shí),我們有時(shí)候需要提供?個(gè)站點(diǎn),來介紹這個(gè)項(xiàng)?的信息,如項(xiàng)?介紹,項(xiàng)?進(jìn)度狀態(tài)、項(xiàng)?組成成員,版本控制信息,項(xiàng)?javadoc索引信息等等。站點(diǎn)管理?命周期定義了站點(diǎn)管理過程的各個(gè)階段

常用命令

常用打包命令

mvn clean package -Dmaven.test.skip=true  -- 跳過單測(cè)打包
mvn clean install -Dmaven.test.skip=true  -- 跳過單測(cè)打包,并把打好的包上傳到本地倉(cāng)庫(kù)
mvn clean deploy -Dmaven.test.skip=true   -- 跳過單測(cè)打包,并把打好的包上傳到遠(yuǎn)程倉(cāng)庫(kù)

其他命令

mvn -v //查看版本 
mvnarchetype:create //創(chuàng)建 Maven 項(xiàng)目 
mvncompile //編譯源代碼 
mvntest-compile //編譯測(cè)試代碼 
mvntest //運(yùn)行應(yīng)用程序中的單元測(cè)試 
mvnsite //生成項(xiàng)目相關(guān)信息的網(wǎng)站 
mvnpackage //依據(jù)項(xiàng)目生成 jar 文件 
mvnpackage-PprofileName //指定profile進(jìn)行打包,依據(jù)項(xiàng)目生成 jar 文件 
mvninstall //在本地 Repository 中安裝 jar
mvn-Dmaven.test.skip=true //忽略測(cè)試文檔編譯 
mvnclean //清除目標(biāo)目錄中的生成結(jié)果 
mvncleancompile //將.java類編譯為.class文件 
mvncleanpackage //進(jìn)行打包 
mvncleantest //執(zhí)行單元測(cè)試 
mvncleandeploy //部署到版本倉(cāng)庫(kù) 
mvncleaninstall //使其他項(xiàng)目使用這個(gè)jar,會(huì)安裝到maven本地倉(cāng)庫(kù)中 
mvnarchetype:generate //創(chuàng)建項(xiàng)目架構(gòu) 
mvndependency:list //查看已解析依賴 
mvndependency:treecom.xx.xxx //看到依賴樹 
mvndependency:analyze //查看依賴的工具 
mvnhelp:system //從中央倉(cāng)庫(kù)下載文件至本地倉(cāng)庫(kù) 
mvnhelp:active-profiles //查看當(dāng)前激活的profiles
mvnhelp:all-profiles //查看所有profiles
mvnhelp:effective-pom //查看完整的pom信息

標(biāo)簽解釋

常用標(biāo)簽詳解

<!-- project 是根標(biāo)簽-->
<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">
    
    <!--指定父項(xiàng)目的坐標(biāo)。如果項(xiàng)目中沒有規(guī)定某個(gè)元素的值,那么父項(xiàng)目中的對(duì)應(yīng)值即為項(xiàng)目的默認(rèn)值。 坐標(biāo)包括group ID,artifact ID和 version。-->
    <parent>
         <!--繼承的父項(xiàng)目的構(gòu)件標(biāo)識(shí)符-->
         <artifactId>maventest</artifactId>
         <!--繼承的父項(xiàng)目的全球唯一標(biāo)識(shí)符-->
         <groupId>com.seven</groupId>
         <!--繼承的父項(xiàng)目的版本:大版本.次版本.小版本 ;snapshot快照 alpha內(nèi)部測(cè)試 beta公測(cè) release穩(wěn)定 GA正式發(fā)布-->
         <version>1.0.0-SNAPSHOT</version>
         <!-- 父項(xiàng)目的pom.xml文件的相對(duì)路徑。相對(duì)路徑允許你選擇一個(gè)不同的路徑。默認(rèn)值是../pom.xml。Maven首先在構(gòu)建當(dāng)前項(xiàng)目的地方尋找父項(xiàng) 目的pom,其次在文件系統(tǒng)的這個(gè)位置(relativePath位置),然后在本地倉(cāng)庫(kù),最后在遠(yuǎn)程倉(cāng)庫(kù)尋找父項(xiàng)目的pom。-->
         <relativePath/>
</parent>
    
    <!-- 當(dāng)前項(xiàng)目的標(biāo)識(shí) -->
     <!--項(xiàng)目的全球唯一標(biāo)識(shí)符,通常使用全限定的包名區(qū)分該項(xiàng)目和其他項(xiàng)目。并且構(gòu)建時(shí)生成的路徑也是由此生成, 如com.mycompany.app生成的相對(duì)路徑為:/com/mycompany/app-->
    <groupId>com.seven.ch</groupId>
    <!-- 構(gòu)件的標(biāo)識(shí)符,它和group ID一起唯一標(biāo)識(shí)一個(gè)構(gòu)件。換句話說,你不能有兩個(gè)不同的項(xiàng)目擁有同樣的artifact ID和groupID;在某個(gè)特定的group ID下,artifact ID也必須是唯一的-->
    <artifactId>Question8_1</artifactId>
    <!--項(xiàng)目產(chǎn)生的構(gòu)件類型,例如jar、war、ear、pom。插件也可以創(chuàng)建自己的構(gòu)件類型,所以前面列的不是全部構(gòu)件類型-->
    <packaging>jar</packaging>
    <!--項(xiàng)目當(dāng)前版本,格式為:主版本.次版本.增量版本-限定版本號(hào)-->
    <version>1.0-SNAPSHOT</version>
    <!-- 項(xiàng)目 描述名-->
    <name></name>
    <!--項(xiàng)目主頁(yè)的URL, Maven產(chǎn)生的文檔用-->
    <url></url>
    <!-- 項(xiàng)目的詳細(xì)描述, Maven 產(chǎn)生的文檔用。-->
    <description></description>
    
    <!-- 集合多個(gè)子模塊,在父中設(shè)置-->
    <modules></modules>
    <!--指定了當(dāng)前的pom的版本-->
    <modelVersion>4.0.0</modelVersion>
    
    <!--在列的項(xiàng)目構(gòu)建profile,如果被激活,會(huì)修改構(gòu)建處理;一般在子pom中設(shè)置-->
    <profiles>
        <!--根據(jù)環(huán)境參數(shù)或命令行參數(shù)激活某個(gè)構(gòu)建處理-->
        <profile>
            <id>betanoah</id>
            <properties>
                <deploy.type>betanoah</deploy.type>
            </properties>
        </profile>
    </profiles>
    
    <!--定義標(biāo)簽,一般在父pom中設(shè)置-->
    <properties>
        <!-- 自定義便簽,設(shè)置依賴版本 -->
        <java_target_version>11</java_target_version>
        <java_source_version>11</java_source_version>
<junit.junit>4.12</junit.junit>
        <spring-boot.version>2.6.6</spring-boot.version>
    </properties>

    <!-- 繼承自該項(xiàng)目的所有子項(xiàng)目的默認(rèn)依賴信息。這部分的依賴信息不會(huì)被立即解析,而是當(dāng)子項(xiàng)目聲明一個(gè)依賴(必須描述group ID和 artifact ID信息),如果group ID和artifact ID以外的一些信息沒有描述,則通過group ID和artifact ID 匹配到這里的依賴,并使用這里的依賴信息。-->
    <!-- 一般在父pom文件里配置 -->
     <dependencyManagement>
          <dependencies>
               <!--參見dependencies/dependency元素-->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
               //...
          </dependencies>
     </dependencyManagement>    
    
    <!-- 依賴列表,一般只在子pom文件里配置,父pom文件只做依賴的版本管理 -->
    <dependencies>
        <dependency>
            <!-- 指定坐標(biāo)從而知道依賴的是哪個(gè)項(xiàng)目-->
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <!-- 這個(gè)類的依賴范圍-->
            <scope></scope>
            <!-- 設(shè)置依賴是否可選   默認(rèn)false 是默認(rèn)繼承-->
            <optional></optional>
            <!-- 排除依賴傳遞列表-->
            <exclusions>
                <exclusion></exclusion>
            </exclusions>
        </dependency>
    </dependencies>
   
    <!-- 插件列表-->
    <build>
        <plugins></plugins>
    </build>
</project>

依賴管理

Maven項(xiàng)目,依賴,構(gòu)建配置,以及構(gòu)件:所有這些都是要建模和表述的對(duì)象。這些對(duì)象通過一個(gè)名為項(xiàng)目對(duì)象模型(Project Object Model, POM)的XML文件描述。

POM是Maven項(xiàng)目管理和構(gòu)建的核心文件,它通常是一個(gè)名為pom.xml的XML文件。POM文件包含了項(xiàng)目的所有配置信息,Maven通過這些信息來構(gòu)建項(xiàng)目、管理依賴以及執(zhí)行其他構(gòu)建任務(wù)。

這個(gè)POM告訴Maven它正處理什么類型的項(xiàng)目,如何修改默認(rèn)的行為來從源碼生成輸出。同樣的方式,一個(gè)Java Web應(yīng)用有一個(gè)web.xml文件來描述,配置,及自定義該應(yīng)用,一個(gè)Maven項(xiàng)目則通過一個(gè) pom.xml 文件定義。該文件是Maven中一個(gè)項(xiàng)目的描述性陳述;也是當(dāng)Maven構(gòu)建項(xiàng)目的時(shí)候需要理解的一份“地圖”。

坐標(biāo)詳解

坐標(biāo),其實(shí)就是從眾多jar包中找到需要的那個(gè)jar包

傳遞性依賴

先考慮一個(gè)基于Spring Framework 的項(xiàng)目,如果不使用Maven, 那么在項(xiàng)目中就需要手動(dòng) 下載相關(guān)依賴。由于Spring Framework 又會(huì)依賴于其他開源類庫(kù),因此實(shí)際中往往會(huì)下載一個(gè)很大的如 spring-framework-2.5.6-with-dependencies.zip 的包,這里包含了所有Spring Framework 的 jar包,以及所有它依賴的其他 jar包。這么做往往就引入了很多不必要的依賴。另一種做法是只下載 spring-framework-2.5.6.zip 這樣一個(gè)包,這里不包含其他相關(guān)依賴,到實(shí)際使用的時(shí)候,再根據(jù)出錯(cuò)信息,或者查詢相關(guān)文檔,加入需要的其他依賴。

Maven 的傳遞性依賴機(jī)制可以很好地解決這一問題。

傳遞性依賴就是,當(dāng)項(xiàng)目A依賴于B,而B又依賴于C的時(shí)候,自然的A會(huì)依賴于C,這樣Maven在建立項(xiàng)目A的時(shí)候,會(huì)自動(dòng)加載對(duì)C的依賴。

groupId

<groupId>org.sonatype.nexus</groupId>
<artifactId>nexus-indexer</artifactId>
<version>2.0.0<Nersion>
<packaging>jar<packaging>

這是 nexus-indexer 的坐標(biāo)定義, nexus-indexer 是一個(gè)對(duì)Maven 倉(cāng)庫(kù)編纂索引并提供搜索功能的類庫(kù),它是 Nexus 項(xiàng)目的一個(gè)子模塊。后面會(huì)詳細(xì)介紹 Nexus。上述代碼片段中,其坐標(biāo)分別為 groupld:org.sonatype.nexus、artifactld:nexus-indexer、version:2.0.0、packaging: jar, 沒有 classifier。下面詳細(xì)解釋一下各個(gè)坐標(biāo)元素:

  • groupId:定義當(dāng)前 Maven 項(xiàng)目隸屬的實(shí)際項(xiàng)目。首先, Maven 項(xiàng)目和實(shí)際項(xiàng)目不一定是一對(duì)一的關(guān)系。比如 Spring Framework 這一實(shí)際項(xiàng)目,其對(duì)應(yīng)的 Maven 項(xiàng)目會(huì)有很多,如 spring-core、spring-context 等。這是由于Maven 中模塊的概念,因此,一個(gè)實(shí)際項(xiàng)目往往會(huì)被劃分成很多模塊。其次, groupId不應(yīng)該對(duì)應(yīng)項(xiàng)目隸屬的組織或公司。原因很簡(jiǎn)單,一個(gè)組織下會(huì)有很多實(shí)際項(xiàng)目,如果 groupId 只定義到組織級(jí)別, 而后面我們會(huì)看到,artifactId 只能定義Maven 項(xiàng)目(模塊), 那么實(shí)際項(xiàng)目這個(gè)層將難以定義。最后, groupId 的表示方式與Java包名的表示方式類似,通常與域名反向一一對(duì)應(yīng)。上例中, groupId 為 org.sonatype.nexus, org.sonatype 表示 Sonatype 公司建立的一 個(gè)非盈利性組織,nexus 表示 Nexus 這一實(shí)際項(xiàng)目,該 groupId 與域名 nexus.sonatype.org 對(duì)應(yīng)。
  • artifactId:該元素定義實(shí)際項(xiàng)目中的一個(gè)Maven項(xiàng)目(模塊), 推薦的做法是使用實(shí)際項(xiàng)目名稱作為 artifactId 的前綴。比如上例中的 artifactId 是 nexus-indexer, 使用了實(shí)際項(xiàng)目名 nexus 作為前綴,這樣做的好處是方便尋找實(shí)際構(gòu)件。在默認(rèn)情況下, Maven生成的構(gòu)件,其文件名會(huì)以 artifactId 作為開頭,如 nexus-indexer-2.0.0.jar, 使用實(shí)際項(xiàng)目名稱作為前綴之后,就能方便從一個(gè) lib文件夾中找到某個(gè)項(xiàng)目的一組構(gòu)件??紤]有5個(gè)項(xiàng)目,每個(gè)項(xiàng)目都有一個(gè) core模塊,如果沒有前綴,我們會(huì)看到很多 core-1.2.jar這樣的文件,加上實(shí)際項(xiàng)目名前綴之后,便能很容易區(qū)分 foo-core-1.2.jar、bar-core-1.2.jar … … 。
  • version:該元素定義Maven 項(xiàng)目當(dāng)前所處的版本,如上例中 nexus-indexer 的版本是 2.0.0。需要注意的是, Maven 定義了一套完整的版本規(guī)范,以及快照 (SNAPSHOT)的概念。
  • packaging:該元素定義 Maven 項(xiàng)目的打包方式。首先,打包方式通常與所生成構(gòu)件的文件擴(kuò)展名對(duì)應(yīng), 如上例中 packaging 為 jar, 最終文件名為 nexus-indexer-2.0.0.jar, 而使用 war 打包方式的Maven 項(xiàng)目,最終生成的構(gòu)件會(huì)有一個(gè) .war 文件, 不過這不是絕對(duì)的。其次,打包方式會(huì)影響到構(gòu)建的生命周期,比如 jar打包和 war打包會(huì)使用不同的命令。最后,當(dāng)不定義 packaging 的時(shí)候,Maven 會(huì)使用默認(rèn)值 jar。
  • classifier:該元素用來幫助定義構(gòu)建輸出的一些附屬構(gòu)件。附屬構(gòu)件與主構(gòu)件對(duì)應(yīng), 如上例中的主構(gòu)件是 nexus-indexer-2.0.0.jar, 該項(xiàng)目可能還會(huì)通過使用一些插件生成如nexus-indexer-2.0.0-javadoc.jar、nexus-indexer-2.0.0-sources. jar 這樣一些附屬構(gòu)件,其包含了Java 文檔和源代碼。這時(shí)候, javadoc和 sources 就是這兩個(gè)附屬構(gòu)件的classifier。這樣,附屬構(gòu)件也就擁有了自己唯一的坐標(biāo)。還有一個(gè)關(guān)于classifier 的典型例子是 TestNG, TestNG 的主構(gòu)件是基于Java 1.4平臺(tái)的,而它又提供了一個(gè)classifier為 jdk5 的附屬構(gòu)件。注意,不能直接定義項(xiàng)目的 classifier, 因?yàn)楦綄贅?gòu)件不是項(xiàng)目直接默認(rèn)生成的,而是由附加的插件幫助生成。

上述5個(gè)元素中, groupId、artifactId、version 是必須定義的, packaging是可選的(默認(rèn)為jar), 而 classifier是不能直接定義的。

同時(shí),項(xiàng)目構(gòu)件的文件名是與坐標(biāo)相對(duì)應(yīng)的, 一般的規(guī)則為 artifactId-version [-classifier].packaging, [-classifier] 表示可選。比如上例 nexus-indexer 的主構(gòu)件為 nexus-indexer-2.0.0.jar, 附屬構(gòu)件有 nexus-indexer-2.0.0-javadoe.jar。這里還要強(qiáng)調(diào)的一點(diǎn)是,packaging 并非一定與構(gòu)件擴(kuò)展名對(duì)應(yīng),比如 packaging 為 maven-plugin 的構(gòu)件擴(kuò)展名為 jar。

此外, Maven 倉(cāng)庫(kù)的布局也是基于Maven 坐標(biāo),這一點(diǎn)會(huì)在介紹 Maven 倉(cāng)庫(kù)的時(shí)候詳細(xì)解釋。同樣地,理解清楚 Maven 坐標(biāo)之后,我們就能開始討論Maven 的依賴管理了。

dependencies

在dependencies標(biāo)簽中添加需要添加的jar對(duì)應(yīng)的Maven坐標(biāo)

<project>
    ...
    <dependencies>
        <dependency>
            <groupId>...</groupId>
            <artifactId>...</artifactId>
            <version>...</version>
            <type>...</type>
            <scope>...</scope>
            <optional>...</optional>
            <exclusions>
                <exclusion>
                ...
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    ...
</project>

根元素 project 下的 dependencies 可以包含一個(gè)或者多個(gè) dependency 元素,以聲明一個(gè)或者多個(gè)項(xiàng)目依賴。每個(gè)依賴可以包含的元素有:

  • groupId 、artifactId 和 version:依賴的基本坐標(biāo),對(duì)于任何一個(gè)依賴來說,基本坐標(biāo)是最重要的, Maven 根據(jù)坐標(biāo)才能找到需要的依賴。
  • type:依賴的類型,對(duì)應(yīng)于項(xiàng)目坐標(biāo)定義的 packaging 。大部分情況下,該元素不必聲明,其默認(rèn)值為jar。
  • scope:依賴的范圍。
  • optional:標(biāo)記依賴是否可選。
  • exclusions:用來排除傳遞性依賴。

大部分依賴聲明只包含基本坐標(biāo),然而在一些特殊情況下,其他元素至關(guān)重要。

scope

依賴范圍

編譯有效

測(cè)試有效

運(yùn)行時(shí)有效

打包有效

例子

Complie

spring-core

test

×

×

×

Junit

provided

×

×

servlet-api,lombok

runtime

×

JDBC驅(qū)動(dòng)

system

×

×

本地maven倉(cāng)庫(kù)之外的類庫(kù)

import

N/A

N/A

N/A

N/A

BOM文件

optional

假設(shè)有這樣一個(gè)依賴關(guān)系,項(xiàng)目A 依賴于項(xiàng)目B, 項(xiàng)目B 依賴于項(xiàng)目X 和Y, B 對(duì)于X 和Y 的依賴都是可選依賴:A->B、B->X(可選)、B->Y(可選)。根據(jù)傳遞性依賴的定義,如果所有這三個(gè)依賴的范圍都是 compile, 那么 X、Y 就是A 的 compile 范圍傳遞性依賴。然而,由于這里X、Y 是可選依賴,依賴將不會(huì)得以傳遞。換句話說, X、Y 將不會(huì)對(duì) A有任何影響,如下圖所示。

圖片圖片

為什么要使用可選依賴這一特性呢? 可能項(xiàng)目B 實(shí)現(xiàn)了兩個(gè)特性,其中的特性一依賴于X, 特性二依賴于Y, 而且這兩個(gè)特性是互斥的,用戶不可能同時(shí)使用兩個(gè)特性。比如 B 是一個(gè)持久層隔離工具包,它支持多種數(shù)據(jù)庫(kù),包括 MySQL、PostgreSQL 等,在構(gòu)建這個(gè)工具包的時(shí)候,需要這兩種數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序,但在使用這個(gè)工具包的時(shí)候,只會(huì)依賴一種數(shù)據(jù)庫(kù)。

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.xiaoshan.mvnbook</groupId>
    <artifactId>project-b</artifactId>
    <version>1.0.0</version>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.10</version>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>8.4-701.jdbc3</version>
            <optional>true</optional>
        </dependency>
    </dependencies>
</project>

上述 XML代碼片段中,使用<optional>元素表示 mysql-connector-java 和 postgresql 這兩個(gè)依賴為可選依賴,它們只會(huì)對(duì)當(dāng)前項(xiàng)目產(chǎn)生影響,當(dāng)其他項(xiàng)目依賴于這個(gè)項(xiàng)目的時(shí)候,這兩個(gè)依賴不會(huì)被傳遞。

因此,當(dāng)項(xiàng)目A依賴于項(xiàng)目B的時(shí)候,如果其實(shí)際使用基于MySQL數(shù)據(jù)庫(kù),那么在項(xiàng)目A中就需要顯式地聲明 mysgl-connectorjava這一依賴,見以下代碼清單。

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.xiaoshan.mvnbook</groupId>
    <artifactId>project-a</artifactId>
    <version>1.0.0</version>
    <dependencies>
        <dependency>
            <groupId>com.xiaoshan.mvnbook</groupId>
            <artifactId>project-b</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.10</version>
        </dependency>
    </dependencies>
</project>

但是實(shí)際上,在理想的情況下,是不應(yīng)該使用可選依賴的。 使用可選依賴的原因是某一個(gè)項(xiàng)目實(shí)現(xiàn)了多個(gè)特性,在面向?qū)ο笤O(shè)計(jì)中,有個(gè)單一職責(zé)性原則,意指一個(gè)類應(yīng)該只有一項(xiàng)職責(zé),而不是糅合太多的功能。

這個(gè)原則在規(guī)劃 Maven 項(xiàng)目的時(shí)候也同樣適用。在上面的例子中,更好的做法是為MySQL 和 PostgreSQL分別創(chuàng)建一個(gè) Maven 項(xiàng)目 , 基于同樣的 groupId 分配不同的artifactId, 如 com.xiaoshan. mvnbook:project-b-mysql 和 com.xiaoshan. mvnbook:project-b-postgresgl, 在各自的 POM 中聲明對(duì)應(yīng)的JDBC 驅(qū)動(dòng)依賴,而且不使用可選依賴,用戶則根據(jù)需要選擇使用 pro-ject-b-mysql 或者 project-b-postgresql。 由于傳遞性依賴的作用,就不用再聲明JDBC 驅(qū)動(dòng)依賴。

排除依賴exclusions

假設(shè)有這樣一種依賴關(guān)系,A->B->C,這個(gè)時(shí)候由于某些原因,不需要對(duì)C的依賴,但是又必須要對(duì)B的依賴,針對(duì)這種情況,可以在添加A對(duì)B的依賴時(shí)申明不需要引進(jìn)B對(duì)C的依賴。具體做法如下:

<dependency>
  <groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.5.20</version>
<exclusions>
    <exclusion>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
    </exclusion>
</exclusions>
</dependency>

依賴沖突

沖突產(chǎn)生的根本原因

圖片圖片

由于傳遞依賴的原因,a會(huì)通過b引入c的依賴,也會(huì)通過d引入c的依賴,因此出現(xiàn)了沖突

依賴關(guān)系

實(shí)例

直接依賴

a和b的依賴關(guān)系

間接依賴

a和c的依賴關(guān)系

依賴沖突的解決方案

路徑最近者優(yōu)先

Maven 依賴調(diào)解 (Dependency Mediation) 的第一原則是:路徑最近者優(yōu)先

項(xiàng)目A 有這樣的依賴關(guān)系: A->B->C->X(1.0)、A->D->X(2.0),根據(jù)路徑最近者優(yōu)先原則,X(1.0) 的路徑長(zhǎng)度為 3 , 而 X(2.0) 的路徑長(zhǎng)度為2, 因此X(2.0) 會(huì)被解析使用。

第一優(yōu)先聲明

但是如果路徑長(zhǎng)度一樣呢,如A->B->Y(1.0)、A-> C->Y(2.0)

從 Maven 2.0.9開始,第二原則是:第一優(yōu)先聲明,也就是誰(shuí)先定義就使用誰(shuí)的

覆寫優(yōu)先原則

? POM 內(nèi)聲明的依賴優(yōu)先于? POM 中聲明的依賴。

  1. 找到 Maven 加載的 Jar 包版本,使? mvn dependency:tree 查看依賴樹,根據(jù)依賴原則來調(diào)整依賴在POM ?件的聲明順序。
  2. 發(fā)現(xiàn)了沖突的包之后,剩下的就是選擇?個(gè)合適版本的包留下,如果是傳遞依賴的包正確,那么把顯示依賴的包exclude掉。如果是某?個(gè)傳遞依賴的包有問題,那需要?動(dòng)把這個(gè)傳遞依賴execlude掉

如何處理無法拉取的jar包

注:本文中所有解決方案均使用IDEA操作

設(shè)置了離線工作

有些用戶的IDEA中可能設(shè)置了離線工作,這項(xiàng)設(shè)置會(huì)讓IDEA無法連接網(wǎng)絡(luò),自然也無法下載所需資源了。要修改這一設(shè)置,具體操作如下:

點(diǎn)擊File>>Settings,在彈出的菜單中選擇Build,Execution,Deployment >> Build Tools >> Maven,然后查看頁(yè)面中的Work Offline項(xiàng)是否處于勾選狀態(tài),如果是,則IDEA無法聯(lián)網(wǎng),應(yīng)該取消勾選。如下圖所示:

圖片圖片

配置文件問題

設(shè)置maven的 settings.xml文件的鏡像 為阿里云鏡像

<mirror>
          <id>alimaven-new</id>
          <name>aliyun maven</name>
          <url>https://maven.aliyun.com/repository/central</url>
          <mirrorOf>central</mirrorOf>
    </mirror>
    
    <mirror>
        <id>aliyun-public</id>
        <mirrorOf>central</mirrorOf>
        <name>aliyun public</name>
        <url>https://maven.aliyun.com/repository/public</url>
    </mirror>

手動(dòng)下載

到以下網(wǎng)站尋找所需要的jar包:

https://repo.maven.apache.org/maven2/

根據(jù)控制臺(tái)輸出信息可知,需要的 com.github.spotbugs:spotbugs-maven-plugin:4.2.2

圖片圖片

找到所需的jar包,進(jìn)行下載

圖片圖片

并放到本地的maven倉(cāng)庫(kù)中。

責(zé)任編輯:武曉燕 來源: seven97
相關(guān)推薦

2015-11-02 09:49:04

Android屏幕適配官方指導(dǎo)

2021-09-30 07:59:06

zookeeper一致性算法CAP

2021-01-15 12:56:36

人工智能人工智能應(yīng)用

2020-12-09 08:01:38

Mybatis關(guān)系型數(shù)據(jù)庫(kù)

2019-08-16 09:41:56

UDP協(xié)議TCP

2022-03-13 09:31:43

MQ消息隊(duì)列ActiveMQ

2021-10-13 16:54:22

IPv6網(wǎng)絡(luò)5G

2021-09-02 07:00:32

鑒權(quán)Web 應(yīng)用Cookie-sess

2019-10-31 09:48:53

MySQL數(shù)據(jù)庫(kù)事務(wù)

2021-05-07 07:52:51

Java并發(fā)編程

2022-03-29 08:23:56

項(xiàng)目數(shù)據(jù)SIEM

2020-09-09 12:55:28

Nginx高并發(fā)性能

2020-09-10 09:31:34

Nginx HTTP代理服務(wù)器

2024-08-27 11:00:56

單例池緩存bean

2017-03-30 22:41:55

虛擬化操作系統(tǒng)軟件

2021-09-10 13:06:45

HDFS底層Hadoop

2023-09-25 08:32:03

Redis數(shù)據(jù)結(jié)構(gòu)

2023-10-04 00:32:01

數(shù)據(jù)結(jié)構(gòu)Redis

2023-11-07 07:46:02

GatewayKubernetes

2021-07-28 13:29:57

大數(shù)據(jù)PandasCSV
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)