Я пытаюсь создать библиотеку, которая будет повторно использоваться приложениями, работающими на эквиваленте 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 в покое?
Любая помощь высоко ценится,
Иэн