我正在尝试创建一个库,该库将被运行在等效WebServer上的应用程序重用。
该库将使用对Guava(v23.6-jre)有依赖性的Selenium(v3.9.1),但是,WebServer在类路径上也具有Guava,因此我遇到了依赖性冲突。当我在应用程序中包含库并运行它时,出现以下错误:
com.google.common.base.Preconditions.checkState(ZLjava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V (java.lang.NoSuchMethodError). (org.mule.api.MessagingException)
org.openqa.selenium.remote.service.DriverService.findExecutable(DriverService.java:124)
org.openqa.selenium.chrome.ChromeDriverService.access$000(ChromeDriverService.java:32)
org.openqa.selenium.chrome.ChromeDriverService$Builder.findDefaultExecutable(ChromeDriverService.java:137)
org.openqa.selenium.remote.service.DriverService$Builder.build(DriverService.java:339)
org.openqa.selenium.chrome.ChromeDriverService.createDefaultService(ChromeDriverService.java:88)
org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:157)
由于我无法更改对服务器本身的依赖关系,因此我想到了使用Maven Shading插件创建uber jar并重新定位guava类-插件配置如下:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<configuration>
<artifactSet>
<includes>
<include>com.google.guava</include>
<include>org.seleniumhq.selenium</include>
</includes>
</artifactSet>
<relocations>
<relocation>
<pattern>com.google.common</pattern>
<shadedPattern>shaded.com.google.common</shadedPattern>
</relocation>
</relocations>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
所以,我相信这是在说:
com.google.common
的引用都移到shaded.com.google.common
。这将产生JAR,如果我将其解压缩,则可以看到google库已被着色。但是,当我运行该应用程序时,出现以下错误:
org.openqa.selenium.remote.service.DriverService$Builder.createArgs()Lshaded/com/google/common/collect/ImmutableList; (java.lang.AbstractMethodError).
我向我建议Selenium DriverService $ Builder类和/或它所引用的Abstract方法在重定位期间没有更新。
如果我同时安置了google库和硒库,我就可以使用它
<relocations>
<relocation>
<pattern>com.google.common</pattern>
<shadedPattern>shaded.com.google.common</shadedPattern>
</relocation>
<relocation>
<pattern>org.openqa.selenium</pattern>
<shadedPattern>shaded.org.openqa.selenium</shadedPattern>
</relocation>
</relocations>
但是,这意味着在我的应用程序(利用该库)中,我需要在“ shaded”包下引用Selenium类。即import shaded.org.openqa.selenium.WebDriver;
无论如何,我是否可以仅对Guava依赖项进行着色,而不必理会Selenium库?
任何帮助, 伊恩