9

I have two dependencies in my pom called A and B. Both A and B have a transitive dependency on an artifact C (cassandra-all). A and B use difference versions of C. Dependency A is the artifact astyanax.

I want to keep the Version of C that comes with B. I accomplished by adding an exclusion in A (Astyanax) for C.

Unfortunately, I want the scope of B to be 'test'. This means that with the exclusion in A, C will not be included outside of the test scope.

How can I resolve this? Can an exclusion be for a specific scope only? Alternatively, can I specify which version to use for a transitive dependency?


Example:
Here is what my pom looks like:

Artifact A (astyanax) with exclusion of dependency on Artifact C (called 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>

So concretely: how can I include cassandra-all when I run code outside of the test scope and still keep the scope of cassandraunit test only?

Tunaki
  • 132,869
  • 46
  • 340
  • 423
Lolo
  • 3,935
  • 5
  • 40
  • 50
  • Possible duplicate of [Exclude maven dependency for tests](https://stackoverflow.com/questions/12053316/exclude-maven-dependency-for-tests) – Andremoniy Dec 07 '17 at 08:16

3 Answers3

6

I apologize if my question wasn't as clear as it could have been. The way I resolved this wasn't hard at all:

  • I added a separate dependency for C in my pom
  • I kept the exclusion of C in A

Concretely here, I just added:

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

and also the following dependency that was missing at runtime otherwise.

    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.6</version>
    </dependency>
Lolo
  • 3,935
  • 5
  • 40
  • 50
1

I am not sure I understood everything, but, in any case, you should be able to achieve this with profiles.

In your pom, create a profile A in which you add your dependency A with exclusion of B and a profile B in which you'll have a dependency with exclusion of A.

On runtime, depending on which of the profile you have selected you'll include one or the other.

HIH

poussma
  • 7,033
  • 3
  • 43
  • 68
1

So concretely: how can I include cassandra-all when I run code outside of the test scope and still keep the scope of cassandraunit test only?

Use Maven POM to configure surefire-maven-plugin and change your classpath.

If what you want is only that the cassandra-all dependency be removed from the classpath while running your tests, then the following POM snippet would make the tricky:

<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>
Community
  • 1
  • 1
Matheus Santana
  • 581
  • 1
  • 6
  • 22