【问题标题】:Maven scope provided and transitive dependenciesMaven 范围提供和传递依赖
【发布时间】:2018-05-19 00:15:04
【问题描述】:

我对其中一个 jar 有依赖关系,并且我已将其标记为 pom xml 中提供的内容。似乎只有一些传递依赖项 jar 被标记为已提供并且未与 war 打包,但其他的仍然是编译范围并与 war libs 打包。我是否需要明确地将范围标记为为所有传递依赖项提供。

pom xml 中的依赖关系:

<dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-ftp</artifactId>
            <scope>provided</scope>
</dependency>

依赖树:

[INFO] +- org.apache.camel:camel-ftp:jar:2.17.0.redhat-630262:provided
[INFO] |  +- com.jcraft:jsch:jar:0.1.54:provided
[INFO] |  +- commons-net:commons-net:jar:3.3.0.redhat-3:provided
[INFO] |  +- com.sun.xml.bind:jaxb-core:jar:2.2.11:compile
[INFO] |  \- com.sun.xml.bind:jaxb-impl:jar:2.2.11.redhat-2:compile
[INFO] +- org.apache.camel:camel-csv:jar:2.17.0.redhat-630262:provided

插件版本详情:

<maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <cdi.api.version>1.2.0.redhat-2</cdi.api.version>
        <javax.inject.version>1.0.0.redhat-6</javax.inject.version>
        <sonar.host.url>http://vfrde2srta0401.agcs.biz:9000</sonar.host.url>
        <xerces.version>2.11.0-22</xerces.version>
        <xmlunit.version>1.6</xmlunit.version>
        <maven.compilerplugin.version>3.7.0</maven.compilerplugin.version>
        <maven.releaseplugin.version>2.5.3</maven.releaseplugin.version>
        <maven.warplugin.version>3.2.0</maven.warplugin.version>
        <maven.jarplugin.version>3.0.2</maven.jarplugin.version>
        <maven.surefireplugin.version>2.20.1</maven.surefireplugin.version>
        <maven.coberturaplugin.version>2.7</maven.coberturaplugin.version>

【问题讨论】:

  • 什么是maven版本?你在使用 maven-war-plugin 吗?
  • maven 3.5,是的,我知道在war插件中指定配置 WEB-INF/lib/*.jar 不会打包所有依赖项,但我只是想了解如何范围由传递依赖决定。
  • 您使用哪个版本的 maven-dependency-plugin?
  • 用插件版本详细信息更新了我的帖子。我对所有插件都使用了最新版本

标签: maven


【解决方案1】:

正如一些人已经指出的那样,provided 范围依赖项的传递依赖项应该在您的项目中获得范围 provided。但是,如果您在compile 范围内有其他依赖项具有相同的传递依赖项,则可以将范围更改为编译。在你的情况下,这两个:

[INFO] |  +- com.sun.xml.bind:jaxb-core:jar:2.2.11:compile
[INFO] |  \- com.sun.xml.bind:jaxb-impl:jar:2.2.11.redhat-2:compile

可能被你的 pom 中的另一个依赖项而不是camel-ftp 传递引入。您需要运行 mvn dependency:tree -Dverbose 以了解为什么这两个将其范围更新为 compile

【讨论】:

    【解决方案2】:

    根据Maven documentation (see table),如果您使用provided 范围定义依赖项,则传递依赖项将根据其原始范围具有以下最终范围:

    • 编译>提供
    • 提供 > 省略
    • 运行时 > 提供
    • 测试> 省略

    您的provided 依赖项的compile 传递依赖项应被视为provided

    【讨论】:

      【解决方案3】:

      基于定义范围的传递依赖范围集。请参阅Introduction to the Dependency Mechanism。您可以通过更改范围然后验证依赖关系树(mvn dependency:tree)来验证这一点。

       <dependency>
                  <groupId>org.apache.camel</groupId>
                  <artifactId>camel-ftp</artifactId>
                  <scope>provided</scope>
                  <version>2.12.2</version>
         </dependency>
      
      
      INFO] \- org.apache.camel:camel-ftp:jar:2.12.2:provided
      [INFO]    +- org.apache.camel:camel-core:jar:2.12.2:provided
      [INFO]    +- com.jcraft:jsch:jar:0.1.49:provided
      [INFO]    \- commons-net:commons-net:jar:3.3:provided
      

      <dependency>
                  <groupId>org.apache.camel</groupId>
                  <artifactId>camel-ftp</artifactId>
                  <!-- <scope>provided</scope> -->
                  <version>2.12.2</version>
       </dependency>
      
       [INFO] \- org.apache.camel:camel-ftp:jar:2.12.2:compile
      [INFO]    +- org.apache.camel:camel-core:jar:2.12.2:compile
      [INFO]    +- com.jcraft:jsch:jar:0.1.49:compile
      [INFO]    \- commons-net:commons-net:jar:3.3:compile
      

       <dependency>
                  <groupId>org.apache.camel</groupId>
                  <artifactId>camel-ftp</artifactId>
                  <scope>runtime</scope>
                  <version>2.12.2</version>
       </dependency>
      
      
      \- org.apache.camel:camel-ftp:jar:2.12.2:runtime
      [INFO]    +- org.apache.camel:camel-core:jar:2.12.2:runtime
      [INFO]    +- com.jcraft:jsch:jar:0.1.49:runtime
      [INFO]    \- commons-net:commons-net:jar:3.3:runtime
      

       <dependency>
                  <groupId>org.apache.camel</groupId>
                  <artifactId>camel-ftp</artifactId>
                  <scope>test</scope>
                  <version>2.12.2</version>
        </dependency>
      
      [INFO] \- org.apache.camel:camel-ftp:jar:2.12.2:test
      [INFO]    +- org.apache.camel:camel-core:jar:2.12.2:test
      [INFO]    +- com.jcraft:jsch:jar:0.1.49:test
      [INFO]    \- commons-net:commons-net:jar:3.3:test
      

      【讨论】:

      • 您好,感谢您的详细解释。但在我的情况下,如果您看到依赖关系树,它的发生方式与您发生的方式不同。
      • 我只是更改了org.apache.camel的范围检查传递依赖范围。
      【解决方案4】:

      我遇到同样的问题,我通过为需要排除的 jar 设置额外提供的范围来解决问题

      【讨论】:

        猜你喜欢
        • 2018-07-30
        • 2016-05-28
        • 2019-08-23
        • 2017-01-15
        • 1970-01-01
        • 2018-09-21
        • 1970-01-01
        • 2017-12-12
        • 1970-01-01
        相关资源
        最近更新 更多