Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Интеграция Google Sheets JAVA API в проект с allure-testng

api
java
allure
testng
Теги: #<Tag:0x00007fedc0170290> #<Tag:0x00007fedc017fee8> #<Tag:0x00007fedc017fa60> #<Tag:0x00007fedc017f6a0>

(Дмитрий Гордиенко) #1

Доброго времени суток, коллеги!

Столкнулся со следующей ситуацией по которой нужен добрый совет.

И так. Есть бызовый проект, в котором лежат “базовые” классы работы с разными модулями: webdriver, httpclient… POM:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>

   <groupId>bese_project</groupId>
   <artifactId>bese_project</artifactId>
   <version>1</version>

   <properties>
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
       <maven.compiler.source>1.8</maven.compiler.source>
       <maven.compiler.target>1.8</maven.compiler.target>
<!-- ======================= VERSIONS ======================= -->
       <java.version>1.8</java.version>
       <log4j.version>1.2.17</log4j.version>
       <slf4j-simple.version>1.7.18</slf4j-simple.version>
       <selenide.version>4.5</selenide.version>
       <json.version>20140107</json.version>
       <commons-codec.version>1.10</commons-codec.version>
       <rest-assured.version>2.8.0</rest-assured.version>
       <jsoup.version>1.10.3</jsoup.version>
       <javax.mail.version>1.5.6</javax.mail.version>
       <compiler.plugin.version>3.6.0</compiler.plugin.version>
       <surefire.plugin.version>2.19.1</surefire.plugin.version>
       <allure.version>2.0-BETA16</allure.version>
       <aspectj.version>1.8.10</aspectj.version>
<!-- ======================= VERSIONS ======================= -->
   </properties>
   <dependencies>
       <dependency>
           <groupId>com.google.api-client</groupId>
           <artifactId>google-api-client</artifactId>
           <version>1.22.0</version>
       </dependency>
       <dependency>
           <groupId>com.google.oauth-client</groupId>
           <artifactId>google-oauth-client-jetty</artifactId>
           <version>1.22.0</version>
       </dependency>
       <dependency>
           <groupId>com.google.apis</groupId>
           <artifactId>google-api-services-sheets</artifactId>
           <version>v4-rev481-1.22.0</version>
       </dependency>
       <dependency>
           <groupId>log4j</groupId>
           <artifactId>log4j</artifactId>
           <version>${log4j.version}</version>
       </dependency>
       <dependency>
           <groupId>org.slf4j</groupId>
           <artifactId>slf4j-simple</artifactId>
           <version>${slf4j-simple.version}</version>
       </dependency>
       <dependency>
           <groupId>io.qameta.allure</groupId>
           <artifactId>allure-testng</artifactId>
           <version>${allure.version}</version>
       </dependency>
       <dependency>
           <groupId>com.codeborne</groupId>
           <artifactId>selenide</artifactId>
           <version>${selenide.version}</version>
       </dependency>
       <dependency>
           <groupId>org.json</groupId>
           <artifactId>json</artifactId>
           <version>${json.version}</version>
       </dependency>
       <dependency>
           <groupId>commons-codec</groupId>
           <artifactId>commons-codec</artifactId>
           <version>${commons-codec.version}</version>
       </dependency>
       <dependency>
           <groupId>com.jayway.restassured</groupId>
           <artifactId>rest-assured</artifactId>
           <version>${rest-assured.version}</version>
       </dependency>
       <dependency>
           <groupId>com.sun.mail</groupId>
           <artifactId>javax.mail</artifactId>
           <version>${javax.mail.version}</version>
       </dependency>
       <dependency>
           <groupId>org.jsoup</groupId>
           <artifactId>jsoup</artifactId>
           <version>${jsoup.version}</version>
       </dependency>
       <dependency>
           <groupId>org.apache.httpcomponents</groupId>
           <artifactId>httpclient</artifactId>
           <version>4.5.3</version>
       </dependency>
       <dependency>
           <groupId>org.seleniumhq.selenium</groupId>
           <artifactId>htmlunit-driver</artifactId>
           <version>2.27</version>
       </dependency>
   </dependencies>

</project>

И есть тестовый проект, т.е. проект, в котором непосредственно лежат тесты и в который подключается “базовый”. POM:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>

   <groupId>test_project</groupId>
   <artifactId>test_project</artifactId>
   <version>1</version>

   <properties>
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
       <compiler.plugin.version>3.6.0</compiler.plugin.version>
       <java.version>1.8</java.version>
       <surefire.plugin.version>2.19.1</surefire.plugin.version>
       <aspectj.version>1.8.10</aspectj.version>
       <allure.results.directory>
           ${project.build.directory}/allure-results
       </allure.results.directory>
   </properties>

   <repositories>
              <repository>
           <id>google-api-services</id>
           <url>https://oss.sonatype.org/content/repositories/releases/</url>
       </repository>
       <repository>
           <id>google-api-services-beta</id>
           <url>http://google-api-client-libraries.appspot.com/mavenrepo</url>
       </repository>
   </repositories>

   <dependencies>
       <dependency>
           <groupId>base_project</groupId>
           <artifactId>base_project</artifactId>
           <version>1</version>
       </dependency>
   </dependencies>

   <build>
       <plugins>
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-compiler-plugin</artifactId>
               <version>${compiler.plugin.version}</version>
               <configuration>
                   <source>${java.version}</source>
                   <target>${java.version}</target>
               </configuration>
           </plugin>
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-surefire-plugin</artifactId>
               <version>${surefire.plugin.version}</version>
               <configuration>
                   <properties>
                       <property>
                           <name>usedefaultlisteners</name>
                           <value>false</value>
                       </property>
                   </properties>
                   <systemProperties>
                       <property>
                           <name>allure.results.directory</name>
                           <value>${allure.results.directory}</value>
                       </property>
                   </systemProperties>
                   <argLine>
                       -javaagent:${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar
                   </argLine>
               </configuration>
               <dependencies>
                   <dependency>
                       <groupId>org.aspectj</groupId>
                       <artifactId>aspectjweaver</artifactId>
                       <version>${aspectj.version}</version>
                   </dependency>
               </dependencies>
           </plugin>
       </plugins>
   </build>

</project>

Появилась необходимость добавить функционал работы с Google Sheets посредством Java API. Согласно дока гугла добавил 3 зависимости в “базовый” проект:

<dependency>
   <groupId>com.google.api-client</groupId>
   <artifactId>google-api-client</artifactId>
   <version>1.22.0</version>
</dependency>
<dependency>
   <groupId>com.google.oauth-client</groupId>
   <artifactId>google-oauth-client-jetty</artifactId>
   <version>1.22.0</version>
</dependency>
<dependency>
   <groupId>com.google.apis</groupId>
   <artifactId>google-api-services-sheets</artifactId>
   <version>v4-rev481-1.22.0</version>
</dependency>

При запуске теста получил:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 15.425 s
[INFO] Finished at: 2017-08-02T18:30:57+03:00
[INFO] Final Memory: 31M/274M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.19.1:test (default-test) on project ***: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.19.1:test failed: There was an error in the forked process
[ERROR] java.util.ServiceConfigurationError: org.testng.ITestNGListener: Provider io.qameta.allure.testng.AllureTestNg could not be instantiated
[ERROR] 	at java.util.ServiceLoader.fail(ServiceLoader.java:232)
[ERROR] 	at java.util.ServiceLoader.access$100(ServiceLoader.java:185)
[ERROR] 	at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:384)
[ERROR] 	at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
[ERROR] 	at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
[ERROR] 	at org.testng.TestNG.addServiceLoaderListeners(TestNG.java:1017)
[ERROR] 	at org.testng.TestNG.initializeConfiguration(TestNG.java:966)
[ERROR] 	at org.testng.TestNG.run(TestNG.java:1089)
[ERROR] 	at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:132)
[ERROR] 	at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.executeSingleClass(TestNGDirectoryTestSuite.java:112)
[ERROR] 	at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java:99)
[ERROR] 	at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:147)
[ERROR] 	at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:290)
[ERROR] 	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:242)
[ERROR] 	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:121)
[ERROR] Caused by: java.lang.NoSuchMethodError: com.fasterxml.jackson.core.JsonFactory.requiresPropertyOrdering()Z
[ERROR] 	at com.fasterxml.jackson.databind.ObjectMapper.<init>(ObjectMapper.java:564)
[ERROR] 	at com.fasterxml.jackson.databind.ObjectMapper.<init>(ObjectMapper.java:474)
[ERROR] 	at io.qameta.allure.model.Allure2ModelJackson.createMapper(Allure2ModelJackson.java:24)
[ERROR] 	at io.qameta.allure.FileSystemResultsWriter.<init>(FileSystemResultsWriter.java:30)
[ERROR] 	at io.qameta.allure.AllureLifecycle.getDefaultWriter(AllureLifecycle.java:281)
[ERROR] 	at io.qameta.allure.AllureLifecycle.<init>(AllureLifecycle.java:47)
[ERROR] 	at io.qameta.allure.Allure.getLifecycle(Allure.java:30)
[ERROR] 	at io.qameta.allure.testng.AllureTestNg.<init>(AllureTestNg.java:107)
[ERROR] 	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
[ERROR] 	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
[ERROR] 	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
[ERROR] 	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
[ERROR] 	at java.lang.Class.newInstance(Class.java:442)
[ERROR] 	at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:380)
[ERROR] 	... 12 more

Как я понимаю, суть проблемы в “Caused by: java.lang.NoSuchMethodError: com.fasterxml.jackson.core.JsonFactory.requiresPropertyOrdering()Z”

Строил дерево зависимостей, смотрел конфликты - не нашел. Собственно и возник вопрос: каким образом зависимости из библиотек влияют на зависимости друг друга. Я наверно что-то не до конца понимаю в maven-e, но, вроде, такого “влияния” не должно быть? Почему зависимости из одного пакета “влияют” на зависимости другого и как исключить такое влияние? Или проблема в другом?


org.testng.ITestNGListener: Provider io.qameta.allure.testng.AllureTestNg could not be instantiated
(Artem Eroshenko) #2

У тебя чего-то не хватает в зависимостях. Вот что говорят на stackoverflow:


(Artem Eroshenko) #3

По-поводу зависимостей: они, естественно, влиюят друг на друга.
Нужно понимать, что classpath - это список зависимостей. А мавен оперирует деревом зависимостей. Соответственно, нужно конвертировать дерево в список. Вот здесь и таятся все проблемы.

Пусть буква обозначает библиотеку, а цифра версию. Например y1 - это библиотека а с версией 1.
Так же предположим, что версии библиотеки не совместимы между собой. Т.е y1 имеет другую сигнатуру методов нежели y1.

Для пример возьмем вот такое дерево:
a -> b -> y1, a -> c -> y2.

В зависимости от обхода дерева (левосторонний, правосторонний), в classpath проекта а будет:

  1. b, y1, c, y2
  2. с, y2, b, y1

Кто первый попал в classpath, тот и папа. Отсюда и возникает все проблемы с NoClassDefFoundError, NoSuchMethodException.

Все усугубляет тот факт, что idea и maven строит classpath по разному. Запускаешь тесты в idea, все работает. Запускаешь в maven - появляется проблема.

Для разрешения таких проблем нужно строить дерево зависимостей и исключать разные версии одной и той же библиотеки. Для того чтобы посмотреть все версии библиотеки можно выполнить команду:
mvn dependency:tree | grep jackson (в случае если хочешь поискать jackson)

Я попытался объяснить на пальцах, в реальности механизм сложнее и имеет кучу ньюансов, но с ними редко кто сталкивается.


(Дмитрий Гордиенко) #4

Благодарю за вариант, попробовал - не взлетело.

Спасибо за разъяснение, учитываю в дальнейших поисках решения.


(Artem Eroshenko) #5

Добавь явно вот эту зависимость в проект:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.8.7</version>
</dependency>

(Artem Eroshenko) #6

MacBook-Pro-Artem:tmp eroshenkoam$ mvn clean dependency:tree | grep jackson
[INFO] | ± com.google.http-client:google-http-client-jackson2:jar:1.22.0:compile
[INFO] | | - com.fasterxml.jackson.core:jackson-core:jar:2.1.3:compile
[INFO] | | | - io.qameta.allure:allure2-model-jackson:jar:1.0-BETA6:compile
[INFO] | | | - com.fasterxml.jackson.module:jackson-module-jaxb-annotations:jar:2.7.0:compile
[INFO] | | ± com.fasterxml.jackson.core:jackson-databind:jar:2.8.5:compile
[INFO] | | ± com.fasterxml.jackson.core:jackson-annotations:jar:2.8.5:compile

Видишь, у тебя тянется com.fasterxml.jackson.core:jackson-core:jar:2.1.3.
Заходим в репозиторий и смотрим код:
https://github.com/FasterXML/jackson-core/blob/master/src/main/java/com/fasterxml/jackson/core/JsonFactory.java#L380

Там написано, что метод появился с версии 2.3.
У нас есть два пути:

  1. Исключить лишнюю зависимость:
<dependency>
    <groupId>com.google.api-client</groupId>
    <artifactId>google-api-client</artifactId>
    <version>1.22.0</version>
        <excludes>
	    <exclude>
		<groupId>com.fasterxml.jackson.core</groupId>
		<artifactId>jackson-core</artifactId>
	    </exclude>
       </excludes>	    		  
</dependency>
  1. Либо просто добавить нужную версию в корень:
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.8.7</version>
</dependency>

(Дмитрий Гордиенко) #7

Сделал. Помимо нее добавил еще 2 (где-то в доке видел), получилось:

 <jackson.version>2.8.7</jackson.version> [также пробовал 2.9.0]

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <!-- Note: core-annotations version x.y.0 is generally compatible with
                 (identical to) version x.y.1, x.y.2, etc. -->
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>${jackson.version}</version>
        </dependency>

Результат:

java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
	at org.openqa.selenium.firefox.Preferences.checkPreference(Preferences.java:225)
	at org.openqa.selenium.firefox.Preferences.setPreference(Preferences.java:155)
	at org.openqa.selenium.firefox.Preferences.setPreference(Preferences.java:126)
	at org.openqa.selenium.firefox.Preferences.readDefaultPreferences(Preferences.java:105)
	at org.openqa.selenium.firefox.Preferences.<init>(Preferences.java:66)
	at org.openqa.selenium.firefox.FirefoxProfile.<init>(FirefoxProfile.java:81)
	at org.openqa.selenium.firefox.FirefoxProfile.<init>(FirefoxProfile.java:71)
	at org.openqa.selenium.firefox.FirefoxProfile.<init>(FirefoxProfile.java:60)
	at core.configs.FireFoxProfiles.defaultProfile(FireFoxProfiles.java:8)
	at core.configs.FireFoxOpts.defaultOptions(FireFoxOpts.java:16)
	at core.services.SelenideImplPage.startProxyFireFoxDriver(SelenideImplPage.java:1174)
	at steps.Steps.get_expected_click_values_from_admin_by_site_domain_aroundBody84(VisitClickLeadSteps.java:1230)
	at steps.Steps$AjcClosure85.run(VisitClickLeadSteps.java:1)
	at org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:149)
	at io.qameta.allure.aspects.StepsAspects.step(StepsAspects.java:46)
	at steps.VisitClickLeadSteps.get_expected_click_values_from_admin_by_site_domain(VisitClickLeadSteps.java:1227)
	at business_logic.ClickTest.click_logic(ClickTest.java:16)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:108)
	at org.testng.internal.Invoker.invokeMethod(Invoker.java:661)
	at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:869)
	at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1193)
	at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:126)
	at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
	at org.testng.TestRunner.privateRun(TestRunner.java:744)
	at org.testng.TestRunner.run(TestRunner.java:602)
	at org.testng.SuiteRunner.runTest(SuiteRunner.java:380)
	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:375)
	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
	at org.testng.SuiteRunner.run(SuiteRunner.java:289)
	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1301)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:1226)
	at org.testng.TestNG.runSuites(TestNG.java:1144)
	at org.testng.TestNG.run(TestNG.java:1115)
	at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:132)
	at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.executeSingleClass(TestNGDirectoryTestSuite.java:112)
	at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java:99)
	at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:147)
	at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:290)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:242)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:121)

P.S. Стектрейс уже попадает в Allure, т.е., походу, уже ошибка выполнения, а не компиляции…


(Дмитрий Гордиенко) #8

Попробовал оба - результат одинаковый:

java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V

(Дмитрий Гордиенко) #9

Теперь, на сколько я понял, вопрос в guava:
[INFO] ± com.fasterxml.jackson.core:jackson-core:jar:2.8.7:compile
[INFO] ± com.google.api-client:google-api-client:jar:1.22.0:compile
[INFO] | ± com.google.oauth-client:google-oauth-client:jar:1.22.0:compile
[INFO] | | ± com.google.http-client:google-http-client:jar:1.22.0:compile
[INFO] | | - com.google.code.findbugs:jsr305:jar:1.3.9:compile
[INFO] | ± com.google.http-client:google-http-client-jackson2:jar:1.22.0:compile
[INFO] | - com.google.guava:guava-jdk5:jar:17.0:compile
[INFO] ± com.google.oauth-client:google-oauth-client-jetty:jar:1.22.0:compile
[INFO] | ± com.google.oauth-client:google-oauth-client-java6:jar:1.22.0:compile
[INFO] | - org.mortbay.jetty:jetty:jar:6.1.26:compile
[INFO] | ± org.mortbay.jetty:jetty-util:jar:6.1.26:compile
[INFO] | - org.mortbay.jetty:servlet-api:jar:2.5-20081211:compile
[INFO] ± com.google.apis:google-api-services-sheets:jar:v4-rev481-1.22.0:compile

Печаль в том, что последння версия етой либы - 2014 года. Чем ее можно заменить?


(Дмитрий Гордиенко) #10

Хочу выразить благодарность Artem Eroshenko.
Вроде взлетело…
Конечный POM:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>base_project</groupId>
    <artifactId>base_project</artifactId>
    <version>1</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
<!-- ======================= VERSIONS ======================= -->
        <java.version>1.8</java.version>
        <log4j.version>1.2.17</log4j.version>
        <slf4j-simple.version>1.7.18</slf4j-simple.version>
        <selenide.version>4.5</selenide.version>
        <json.version>20140107</json.version>
        <commons-codec.version>1.10</commons-codec.version>
        <rest-assured.version>2.8.0</rest-assured.version>
        <jsoup.version>1.10.3</jsoup.version>
        <javax.mail.version>1.5.6</javax.mail.version>
        <compiler.plugin.version>3.6.0</compiler.plugin.version>
        <surefire.plugin.version>2.19.1</surefire.plugin.version>
        <allure-testng.version>2.0-BETA16</allure-testng.version>
        <aspectj.version>1.8.10</aspectj.version>
        <jackson.version>2.8.7</jackson.version>
        <guava.version>22.0</guava.version>
        <google.api.supurt.version>1.22.0</google.api.supurt.version>

<!-- ======================= VERSIONS ======================= -->
    </properties>
    <dependencies>
        <!-- ############ THIS BLOCK NEEDS FOR CORRECT WORK OF GOOGLE SHEETS API ############ -->
        <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>${guava.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.google.api-client</groupId>
            <artifactId>google-api-client</artifactId>
            <version>${google.api.supurt.version}</version>
        </dependency>
        <dependency>
            <groupId>com.google.oauth-client</groupId>
            <artifactId>google-oauth-client-jetty</artifactId>
            <version>${google.api.supurt.version}</version>
        </dependency>
        <dependency>
            <groupId>com.google.apis</groupId>
            <artifactId>google-api-services-sheets</artifactId>
            <version>v4-rev481-1.22.0</version>
        </dependency>
        <!-- ############ ############################################### ############ -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>${slf4j-simple.version}</version>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.11</version>
        </dependency>
        <dependency>
            <groupId>io.qameta.allure</groupId>
            <artifactId>allure-testng</artifactId>
            <version>${allure-testng.version}</version>
        </dependency>
        <dependency>
            <groupId>com.codeborne</groupId>
            <artifactId>selenide</artifactId>
            <version>${selenide.version}</version>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>${json.version}</version>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>${commons-codec.version}</version>
        </dependency>
        <dependency>
            <groupId>com.jayway.restassured</groupId>
            <artifactId>rest-assured</artifactId>
            <version>${rest-assured.version}</version>
        </dependency>
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>${javax.mail.version}</version>
        </dependency>
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>${jsoup.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.3</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>htmlunit-driver</artifactId>
            <version>2.27</version>
        </dependency>
    </dependencies>

</project>

(Artem Eroshenko) #11

Молоток


(Дмитрий Гордиенко) #12

Ет я погорячился :frowning:
Точнее, да, тест который юзает Google Sheet api - взлетел. Но… Тесты которые юзают browsermobproxy - загнулись, верней не сами тесты, а bmp:

[LittleProxy-0-ClientToProxyWorker-3] ERROR org.littleshoot.proxy.impl.ClientToProxyConnection - (AWAITING_INITIAL) [id: 0xc00c869f, L:/fe80:0:0:0:e411:4781:a2f4:58e8%9:1113 - R:/fe80:0:0:0:e411:4781:a2f4:58e8%9:50722]: Caught an exception on ClientToProxyConnection
java.lang.NoSuchMethodError: com.google.common.net.HostAndPort.getHostText()Ljava/lang/String;
	at net.lightbody.bmp.util.BrowserMobHttpUtil.removeMatchingPort(BrowserMobHttpUtil.java:279)
	at net.lightbody.bmp.filters.HttpsHostCaptureFilter.clientToProxyRequest(HttpsHostCaptureFilter.java:36)
	at net.lightbody.bmp.filters.BrowserMobHttpFilterChain.clientToProxyRequest(BrowserMobHttpFilterChain.java:65)
	at org.littleshoot.proxy.impl.ClientToProxyConnection.doReadHTTPInitial(ClientToProxyConnection.java:242)
	at org.littleshoot.proxy.impl.ClientToProxyConnection.readHTTPInitial(ClientToProxyConnection.java:206)
	at org.littleshoot.proxy.impl.ClientToProxyConnection.readHTTPInitial(ClientToProxyConnection.java:80)
	at org.littleshoot.proxy.impl.ProxyConnection.readHTTP(ProxyConnection.java:135)
	at org.littleshoot.proxy.impl.ProxyConnection.read(ProxyConnection.java:120)
	at org.littleshoot.proxy.impl.ProxyConnection.channelRead0(ProxyConnection.java:587)
	at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:367)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:353)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:346)
	at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:266)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:367)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:353)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:346)
	at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86)
	at org.littleshoot.proxy.impl.ProxyConnection$RequestReadMonitor.channelRead(ProxyConnection.java:715)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:367)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:353)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:346)
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:293)
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:267)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:367)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:353)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:346)
	at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86)
	at org.littleshoot.proxy.impl.ProxyConnection$BytesReadMonitor.channelRead(ProxyConnection.java:692)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:367)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:353)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:346)
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1294)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:367)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:353)
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:911)
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131)
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:652)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:575)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:489)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:451)
	at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:140)
	at java.lang.Thread.run(Thread.java:748)

По моему мнению вся лажа в java.lang.NoSuchMethodError: com.google.common.net.HostAndPort.getHostText()Ljava/lang/String;. Если правильно понял, ето модуль com.google.guava. Вероятнее всего, новая версия guava (22) не устраивает bmp.

Пробовал:

<dependency>
            <groupId>com.codeborne</groupId>
            <artifactId>selenide</artifactId>
            <version>${selenide.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.guava</groupId>
                    <artifactId>guava</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

Не взлетело, ошибка не поменялась.

Что бы использовать разные версии одной и той же либы, разбил основной проект на подмодули:

  1. google-api - тут оставил guava 22;
  2. atc - сначала вообще guava не включал (bmp вылетал с указанной ошибкой), включил guava 17 - перестал заводиться google-api.

Пришел к выводу: либо дело не в guava, либо я как-то не так разнес модули, т.к. продолжается взаимосвязь библиотек…

POM GOOGLE-API:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>AutoTestCore</artifactId>
        <groupId>AutoTestCore</groupId>
        <version>3.0.24-BETA</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>google-api</artifactId>
    <version>3.0.24-BETA</version>
    <packaging>jar</packaging>

    <properties>
        <jackson.version>2.8.7</jackson.version>
        <guava.version>22.0</guava.version>
        <google.api.supurt.version>1.22.0</google.api.supurt.version>
    </properties>

    <dependencies>
         <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>${guava.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.google.api-client</groupId>
            <artifactId>google-api-client</artifactId>
            <version>${google.api.supurt.version}</version>
        </dependency>
        <dependency>
            <groupId>com.google.oauth-client</groupId>
            <artifactId>google-oauth-client-jetty</artifactId>
            <version>${google.api.supurt.version}</version>
        </dependency>
        <dependency>
            <groupId>com.google.apis</groupId>
            <artifactId>google-api-services-sheets</artifactId>
            <version>v4-rev481-1.22.0</version>
        </dependency>
    </dependencies>

</project>

POM со всеми остальными зависимостями:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>AutoTestCore</artifactId>
        <groupId>AutoTestCore</groupId>
        <version>3.0.24-BETA</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>atc</artifactId>
    <version>3.0.24-BETA</version>

    <properties>
        <!-- ======================= VERSIONS ======================= -->
        <java.version>1.8</java.version>
        <log4j.version>1.2.17</log4j.version>
        <slf4j-simple.version>1.7.18</slf4j-simple.version>
        <selenide.version>4.5</selenide.version>
        <json.version>20140107</json.version>
        <commons-codec.version>1.10</commons-codec.version>
        <rest-assured.version>2.8.0</rest-assured.version>
        <jsoup.version>1.10.3</jsoup.version>
        <javax.mail.version>1.5.6</javax.mail.version>
        <compiler.plugin.version>3.6.0</compiler.plugin.version>
        <surefire.plugin.version>2.19.1</surefire.plugin.version>
        <allure-testng.version>2.0-BETA16</allure-testng.version>
        <aspectj.version>1.8.10</aspectj.version>
        <!-- ======================= VERSIONS ======================= -->
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>17.0</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>${slf4j-simple.version}</version>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.11</version>
        </dependency>
        <dependency>
            <groupId>io.qameta.allure</groupId>
            <artifactId>allure-testng</artifactId>
            <version>${allure-testng.version}</version>
        </dependency>
        <dependency>
            <groupId>com.codeborne</groupId>
            <artifactId>selenide</artifactId>
            <version>${selenide.version}</version>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>${json.version}</version>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>${commons-codec.version}</version>
        </dependency>
        <dependency>
            <groupId>com.jayway.restassured</groupId>
            <artifactId>rest-assured</artifactId>
            <version>${rest-assured.version}</version>
        </dependency>
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>${javax.mail.version}</version>
        </dependency>
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>${jsoup.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.3</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>htmlunit-driver</artifactId>
            <version>2.27</version>
        </dependency>
    </dependencies>

</project>

Родительский POM:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>AutoTestCore</groupId>
    <artifactId>AutoTestCore</artifactId>
    <packaging>pom</packaging>
    <version>3.0.24-BETA</version>
    <modules>
        <module>google-api</module>
        <module>atc</module>
    </modules>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

</project>

Коллеги, подскажите плз, почему библиотеки зависимостей продолжают влиять друг на друга даже из разных модулей? Или что еще может быть причиной такого поведения?