日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Maven依赖详细理解

發布時間:2023/12/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Maven依赖详细理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Maven依賴理解

  • 1 簡介
  • 2 依賴的配置
  • 3 依賴的范圍
  • 4 傳遞性依賴
    • 4.1 傳遞性依賴和依賴調解
  • 5 依賴調解
  • 6 可選依賴
  • 7 總結
  • 8 下載

1 簡介

?在Maven項目中,有一個核心文件pom.xml。POM項目對象模型定義了項目的基本信息,用于描述心目如何構建,聲明項目依賴。
?沒有任何的實際Java代碼,我們就能頂一個Maven項目的POM,這體現了Maven的一大優點,它能讓項目對象模型最大程度地與實際代碼相互獨立,即解耦,或者正交性。這在很大程度上避免了Java代碼和POM代碼的相互影響。比如當項目需要升級版本時,只需要修改POM,而不需要更待Java代碼;而在POM穩定之后,日常的Java代碼開發工作基本不涉及POM的修改。
下面的pom文件即為一個xml

<?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><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.3.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>screenshot</artifactId><version>0.0.1-SNAPSHOT</version><name>screenshot</name><description>Demo project for Spring Boot</description><packaging>war</packaging><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- 移除嵌入式tomcat插件 --><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency></dependencies><build><finalName>screenshot</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>${java.version}</source><target>${java.version}</target><skip>true</skip><encoding>UTF-8</encoding><compilerArguments><extdirs>${project.basedir}/src/main/resources/lib</extdirs></compilerArguments></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.1.0</version><configuration><webResources><resource><directory>src/main/resources/lib</directory><targetPath>WEB-INF/lib</targetPath><includes><include>**/*.jar</include></includes></resource><resource><directory>src/main/java/com/cetc52/screenshot/sdk</directory><targetPath>WEB-INF/sdk</targetPath></resource></webResources><failOnMissingWebXml>false</failOnMissingWebXml></configuration></plugin></plugins></build></project>

在POM文件中標簽下的每個即表示該項目的一個直接依賴。

2 依賴的配置

?從上述的簡單pom.xml文件中,可以看到Maven項目的依賴聲明如下:

<project><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><type></type><scope></scope><optional></optional><exclusions><exclusion>…</ exclusion><exclusion>…</ exclusion></exclusions></dependency></dependencies> </project>

根元素project下的dependencies可以包含一個或者多個dependency元素,以聲明一個或多個項目依賴。

  • groupId, artifactId, version具體含義同Maven坐標,對于任何一個依賴,使用Maven坐標機制找打準確的依賴。
  • type依賴的類型,對英語項目坐標定義的packaging,大部分情況下,元素不必填寫,默認為jar
  • scop依賴范圍
  • optional標記依賴是否可選
  • exclusions用來排除傳遞依賴
  • 3 依賴的范圍

    Maven在編譯項目、測試項目、以及運行項目時使用三套classpath。編譯時classpath為src/main/resources,測試時classpath為src/test/resources,在運行時classpath則為target/classes。
    依賴范圍就是用來控制依賴與這三種classpath(編譯classpath、測試classpath、運行classpath)的關系。

    不考慮import依賴范圍,其他各種依賴范圍與三種classpath的關系參見Maven依賴范圍與classpath、依賴傳遞如圖:

    4 傳遞性依賴

    ?Maven在幫助開發人員根據POM下載依賴時,會自動解析Maven項目的依賴,包括直接在POM文件中定義的直接依賴,以及每個依賴依賴的其他依賴。這個過程會自動進行,不需要手動干預。
    spring-core有一個依賴commons-logging依賴。

    <dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version> </dependency>

    ?該依賴沒有聲明依賴范圍,那么其依賴范圍就是默認的compile。因此依賴圖示如下:

    ?通過傳遞性依賴機制,Maven項目就不需要考慮它依賴了什么,也不用擔心引入多余的依賴。Maven會解析各個直接的POM,將那些必要的間接依賴以傳遞性依賴的形式引入到當前項目中。

    4.1 傳遞性依賴和依賴調解

    ?假設A依賴B,B依賴C,我們說A對于B是第一直接依賴,B對于C是第二直接依賴。A對于C是傳遞性依賴。第一直接依賴的范圍和第二直接依賴的范圍決定了傳遞性依賴的范圍。下表中,最左邊表示第一直接依賴范圍,最上邊為第二直接依賴范圍,中間的交叉單元格則表示傳遞性依賴范圍。

    ?通過查看上圖,可以發現這樣的規律,當第二直接依賴的范圍為compile的時候,傳遞性依賴范圍與第一直接依賴的范圍一致。當第二直接依賴的范圍為test的時候,依賴不會傳遞;當第二直接依賴的范圍為是provided的時候,只傳遞第一直接依賴范圍也為provided的依賴,且傳遞性依賴范圍同樣為provided;當第二直接依賴的范圍是runtime的時候,傳遞性依賴的范圍與第一直接依賴一致,但compile例外,此時傳遞性依賴的范圍為runtime

    5 依賴調解

    ?大部分情況下,我們只需要關心項目的直接依賴是什么,而不用考慮這些依賴會引入什么傳遞性依賴,當傳遞性依賴造成問題的時候,則需要清楚的知道該傳遞性依賴是從那條依賴路徑引入的。

    6 可選依賴

    ?一種場景是A–>B, B–>X(可選),B–>Y(可選),如果這三個依賴的范圍都是compile,那么X、Y、就是A的compile范圍傳遞性依賴。然而由于這里X、Y是可選依賴,依賴不會傳遞。換句話說X、Y不會對A有任何影響。
    項目B實現了兩個特性,其中一項特性依賴X,另一項特性依賴Y,而且兩個特性是互斥的。


    ?上述圖片中,使用表示依賴是可選的。它們zhi 對當前項目B產生影響,當其他項目需要依賴B的時候,這兩個依賴不會傳遞,因此,當項目A依賴于項目B的時候,如果其實際使用MySQL數據庫,那么在項目A中就必須顯式的聲明mysql-connector-java這個依賴。
    ?在理想的情況下,是不應該使用可選依賴的。使用可選依賴的原因是一個項目實現了多個特性,在面向對象設計中,存在單一職責原則,意為一個類應該只有一個原則,而不是糅合太多的功能,這個原則在規劃Maven項目的時候同樣適用。

    7 總結

    ?本文章總結了Maven實戰p62—p68的內容。主要內容包括Maven項目中依賴聲明的格式,依賴范圍的含義傳遞性依賴和依賴范圍,以及依賴調解的兩個原則。最后對于可選依賴的使用進行了簡要的闡述,希望能夠通過該文檔增加對依賴理解的深度。

    8 下載

    Maven 依賴詳細理解.pdf

    20196717:22:55端午第一天于馬塍路36

    總結

    以上是生活随笔為你收集整理的Maven依赖详细理解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。