maven的傳遞依賴與scope關(guān)系

maven的傳遞依賴與scope關(guān)系

項目里有個common工程,其他模塊會通過maven依賴方式引入,本想在common中依賴test用的jar,如junit,這樣其他引入common就可以傳遞依賴common的test用jar,就不用自己再引入,反正都要用到。但是卻發(fā)現(xiàn)scope為test的jar無法通過傳遞依賴,看了看maven官網(wǎng)對于傳遞依賴與scope的關(guān)系:

https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope

Each of the scopes (except for import) affects transitive dependencies in different ways, as is demonstrated in the table below. If a dependency is set to the scope in the left column, transitive dependencies of that dependency with the scope across the top row will result in a depen
dency in the main project with the scope listed at the intersection. If no scope is listed, it means the dependency will be omitted.

大致的意思是工程A的依賴的scope如第一行,工程B引入了工程A且scope為左側(cè)第一列,那么工程A傳遞到工程B的依賴的scope將如表格中交叉項所示

編譯 提供 運行 測試
編譯 編譯(*) -- 運行 --
提供 提供 -- 提供 --
運行 運行 -- 運行 --
測試 測試 -- 測試 --

舉個例子:

下面是一個工程A的依賴,junit測試用,jdbc驅(qū)動runtime用,servlet容器會提供,lang3編譯就要使用

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.10</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>com.oracle.jdbc</groupId>
        <artifactId>com.springsource.oracle.jdbc</artifactId>
        <version>11.1.0.7</version>
        <scope>runtime</scope>
    </dependency>

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.4</version>
    </dependency>
</dependencies>

在工程B的pom中引入工程A,scope為compile,工程B會得到A的傳遞依賴

    <dependency>
        <groupId>hello</groupId>
        <artifactId>A</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>

結(jié)果:

jdbc[runtime] runtime傳遞過來還是runtime,如果編譯期需要用的話還是要顯式指定

lang3[compile]

proivide與test并不會傳遞,解釋了開頭的問題。

工程B中引入A,scope為provided

    <dependency>
        <groupId>hello</groupId>
        <artifactId>A</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <scope>provided</scope>
    </dependency>

結(jié)果:

jdbc[provided]

lang3[provided]

同理,工程B中引入A,scope為runtime或test,傳遞依賴的scope都將是runtime或test。

總結(jié)

  • scope為test或provide的依賴不會傳遞,所以要多個工程指定相同的test依賴還是使用parent pom好了
  • scope為runtime的依賴被compile傳遞后還是runtime
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 項目的依賴關(guān)系主要分為三種:依賴,繼承,聚合 依賴關(guān)系 依賴關(guān)系是最常用的一種,就是你的項目需要依賴其他項目,比如...
    41uLove閱讀 1,082評論 0 1
  • 一、scope作用域介紹 Maven的一個哲學是約定大于配置,所以在maven中,很多內(nèi)容都有默認值,scope的...
    繁華似錦Fighting閱讀 8,310評論 16 17
  • Maven依賴中scope的含義 整理一下Maven中Scope的詳細作用,都是抄的別人內(nèi)容整理了一下。參考:ht...
    UEUEO閱讀 35,123評論 7 33
  • Maven在編譯,測試和運行時使用的是不同的ClassPath, 所以Maven通過dependency的scop...
    邵增衛(wèi)閱讀 409評論 0 0
  • 轉(zhuǎn)載地址 項目的依賴關(guān)系主要分為三種:依賴,繼承,聚合 依賴關(guān)系 依賴關(guān)系是最常用的一種,就是你的項目需要依賴其他...
    ifeelok0319閱讀 738評論 0 1

友情鏈接更多精彩內(nèi)容