提供Maven范围和传递依赖性

时间:2017-12-05 10:54:32

标签: maven

我有一个jar的依赖关系,我已经在pom xml中提供了标记。似乎只有一些传递依赖jar被标记为提供并且没有与war打包,但是其他jar仍然是使用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>

4 个答案:

答案 0 :(得分:2)

正如一些人已经指出的那样,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的提示。

答案 1 :(得分:1)

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

  • 编译&gt;提供
  • 提供&gt; 省略
  • 运行时&gt;提供
  • test&gt; 省略

compile依赖关系provided依赖关系应该被视为provided

答案 2 :(得分:0)

基于已定义范围设置的传递依赖关系范围。请参阅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

答案 3 :(得分:0)

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