使用Maven阴影插件对传递依赖项(番石榴)进行着色

时间:2019-01-14 12:56:30

标签: java maven dependency-management

我正在尝试创建一个库,该库将被运行在等效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>

所以,我相信这是在说:

  • 在我的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类和/或它所引用的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库?

任何帮助, 伊恩

0 个答案:

没有答案