不明确的Maven依赖性破坏了Selenium

时间:2016-03-04 21:55:50

标签: java maven selenium

摘自我项目的依赖树:

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

通过operadriverselenium-remote-driver需要两次番石榴。在后一种情况下,声明依赖性没有版本。该项目本身需要qxwebdriver-java,仅此而已。

在此配置中,Safari驱动程序不起作用:

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

这是因为项目对Guava的整体依赖性解析为14.0(通过operadriver)。但是,在Guava 19.0中引入了所需的Stopwatch::createStarted()方法。手动将Guava 19.0依赖项添加到项目的POM中可以解决问题。

但这不是Selenium和/或Opera驱动程序打包的问题吗?你认为它应该在上游报告,还是我的解决方法是在Maven中做这样的事情的正确方法?

1 个答案:

答案 0 :(得分:1)

这是Java和Maven中非常常见的情况,而不是缺陷。

正确的解决方案是在您的pom中添加exclusion。像这样:

<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>

请注意,在极少数情况下 - 例如,如果guava版本19从版本14中弃用了某些东西,则操作符1.5取决于 - 这样做可能会破坏,在这种情况下,操作数。