Dimitri
Dimitri

Reputation: 301

Ambiguous Maven dependency breaks Selenium

An excerpt from my project's dependency tree:

myproject
+- qxwebdriver-java 0.0.3
   +- operadriver 1.5
   |  +- guava 14.0
   +- selenium-java 2.52.0
      +- selenium-remote-driver 2.52.0
      |  +- guava
      +- selenium-safari-driver 2.52.0

Guava is required two times, via operadriver and selenium-remote-driver. In the latter case, dependency is declared without version. The project itself requires qxwebdriver-java and nothing more.

In this configuration, Safari driver does not work:

java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.createStarted()Lcom/google/common/base/Stopwatch;
        at org.openqa.selenium.safari.SafariDriverCommandExecutor.start(SafariDriverCommandExecutor.java:111)

This happens because the project's overall dependency on Guava resolves to 14.0 (via operadriver). However the required Stopwatch::createStarted() method has been introduced in Guava 19.0. Manually adding Guava 19.0 dependency to the project's POM fixes the issue.

But isn't this an issue of Selenium and/or Opera driver packaging? Do you think it should be reported upstream, or is my workaround the right way to do things like this in Maven?

Upvotes: 0

Views: 890

Answers (1)

SiKing
SiKing

Reputation: 10329

This is a perfectly common situation in Java and Maven, and not a defect.

The correct solution is to add an exclusion in your pom. Something like this:

<dependency>
    <groupId>com.opera</groupId>
    <artifactId>operadriver</artifactId>
    <version>1.5</version>
    <exclusions>
        <!-- outdated library conflicts with selenium-java -->
        <exclusion>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>[2.33.0,)</version>
    <scope>test</scope>
</dependency>

Note that in rare cases - for example if guava version 19 deprecated something from version 14, that operadriver 1.5 depends on - doing this could break, in this case, operadriver.

Upvotes: 1

Related Questions