Затенение переходной зависимости (гуавы) с помощью плагина Maven Shading - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь создать библиотеку, которая будет повторно использоваться приложениями, работающими на эквиваленте WebServer.

Библиотека будет использовать 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)

Поскольку я не могу изменить зависимости на самом сервере, я подумал об использовании плагина Maven Shading для создания Uber JAR и перемещения классов гуавы - с плагином, настроенным следующим образом:

<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>

Однако это означает, что в моем приложении (которое использует библиотеку) мне нужно сослаться на классы Selenium в «затененном» пакете. т.е. import shaded.org.openqa.selenium.WebDriver;

В любом случае, я могу просто затенить зависимости Guava, но оставить библиотеки Selenium в покое?

Любая помощь высоко ценится, Иэн

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...