使用 Maven Shading 插件对传递依赖项 (guava) 进行着色

use*_*382 5 java dependency-management maven

我正在尝试创建一个库,该库将由在 Web 服务器等效项上运行的应用程序重用。

该库将使用 Selenium (v3.9.1),它依赖于 Guava (v23.6-jre),但是,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)
Run Code Online (Sandbox Code Playgroud)

由于我无法更改服务器本身的依赖关系,我想到使用 Maven Shading Plugin 创建一个 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>
Run Code Online (Sandbox Code Playgroud)

所以,我相信这句话是在说:

  • 将番石榴和硒放入我的 FAT JAR 中。
  • 将所有引用重新定位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 类和/或其引用的抽象方法在迁移过程中没有更新。

如果我重新定位谷歌库和硒库,我就可以让它工作

<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>
Run Code Online (Sandbox Code Playgroud)

但是,这意味着在我的应用程序(使用该库)中,我需要引用“shaded”包下的 Selenium 类。IEimport shaded.org.openqa.selenium.WebDriver;

无论如何,我是否可以只遮蔽 Guava 依赖项,而保留 Selenium 库?

非常感谢任何帮助,伊恩