2016-03-04 52 views
0

摘錄從我的項目的依賴關係樹:曖昧Maven的依賴性打破硒

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) 

這是因爲該項目對番石榴總撫養解析爲14.0(通過operadriver)。然而,所需的Stopwatch::createStarted()方法已經在Guava 19.0中引入。將Guava 19.0依賴項手動添加到項目的POM可解決此問題。

但這不是Selenium和/或Opera驅動程序打包的問題嗎?你認爲應該向上游報告還是我的解決方法是在Maven中做這樣的事情的正確方法?

回答

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> 

注意,在極少數情況下 - 例如,如果棄用番石榴版本19 14版本的東西,這operadriver 1.5依賴 - 這樣做可能會打破,在這種情況下,operadriver。

+0

我的理解是否正確,在我們的情況下,添加這樣的排除應該(理想情況下)是'qxwebdriver-java'維護者的責任? – Dimitri

+0

@Avishai從您描述的依賴關係層次結構中,應該在qxwebdriver-java的pom中完成。另外:我簡要看了一下https://github.com/qooxdoo/qxwebdriver-java/blob/master/pom.xml,在那裏我看到了selenium-java:2.45.0和operadriver:1.1。所以我不確定你從哪裏得到你的版本。 – SiKing

+0

最初的qxwebdriver-java repo是有點過時的,所以我擺弄叉意圖更新依賴到最新版本。現在一切正常,謝謝你的提示! – Dimitri