摘自我项目的依赖树:
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
通过operadriver
和selenium-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中做这样的事情的正确方法?
答案 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取决于 - 这样做可能会破坏,在这种情况下,操作数。