如何仅排除特定范围的依赖项?

时间:2012-11-26 20:20:26

标签: maven dependencies

我的pom中有两个依赖项,称为A和B.A和B都具有对工件C(cassandra-all)的传递依赖性。 A和B使用C的差异版本。依赖关系A是工件 astyanax

我希望保留B附带的C的版本。我通过在A(Astyanax)中为C添加排除来完成。

不幸的是,我希望B的范围是'测试'。这意味着在A中排除,C不会包含在测试范围之外。

我该如何解决这个问题?排除只能针对特定范围吗?或者,我可以指定用于传递依赖的版本吗?

<小时/> 示例:
这是我的pom的样子:

神器A(astyanax),不包括对神器C的依赖(称为cassandra-all)

    <dependency>
        <groupId>com.netflix.astyanax</groupId>
        <artifactId>astyanax</artifactId>
        <version>1.0.4</version>
        <exclusions>
            <exclusion>
                <groupId>org.apache.cassandra</groupId>
                <artifactId>cassandra-all</artifactId>
            </exclusion>
        </exclusions>  
    </dependency>
    <dependency>
        <groupId>org.cassandraunit</groupId>
        <artifactId>cassandra-unit</artifactId>
        <version>1.1.1.1</version>
        <scope>test</scope>
    </dependency>

具体来说:当我在测试范围之外运行代码并且仍然只保留cassandraunit测试的范围时,如何包含cassandra-all?

3 个答案:

答案 0 :(得分:4)

如果我的问题不尽如人意,我道歉。我解决这个问题的方式并不难:

  • 我在我的pom中为C添加了一个单独的依赖项
  • 我在A
  • 中排除了C

具体来说,我刚刚补充说:

    <dependency>
        <groupId>org.apache.cassandra</groupId>
        <artifactId>cassandra-all</artifactId>
        <version>1.1.5</version>
    </dependency>

以及运行时缺少的以下依赖项。

    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.6</version>
    </dependency>

答案 1 :(得分:1)

  

具体来说:当我在测试范围之外运行代码并且仍然只保留cassandraunit测试的范围时,如何包含cassandra-all?

Use Maven POM to configure surefire-maven-pluginchange your classpath

如果您想要的只是在运行测试时从类路径中删除cassandra-all依赖项,那么以下POM代码段将变得棘手:

<build>
  <!-- ... -->

  <plugins>
    <!-- ... -->

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <configuration>
        <classpathDependencyExcludes>
          <classpathDependencyExcludes>
            org.apache.cassandra:cassandra-all
          </classpathDependencyExcludes>
        </classpathDependencyExcludes>
      </configuration>
    </plugin>
  </plugins>
</build>

答案 2 :(得分:0)

我不确定我是否了解所有内容,但无论如何,您应该能够通过个人资料实现此目标。

在您的pom中,创建一个配置文件A,在其中添加您的依赖关系A,但不包括B和配置文件B,在该配置文件中,您将具有排除A的依赖关系。

在运行时,根据您选择的配置文件,您将包含其中一个。

HIH