AWS Lambda Jar не может архивировать после добавления зависимостей селена в pom - PullRequest
7 голосов
/ 18 октября 2019

Это странная ошибка. После добавления селеновых зависимостей в pom моего проекта maven и загрузки его в лямбду, он говорит, что не может разархивировать файл. Однако после удаления зависимостей лямбда-файл может разархивировать файл очень хорошо (однако в результате получается класс, не найденный впоследствии). Я пытался удалить зависимости одну за другой, но каждая вызывает ошибку.

Есть идеи, как ее решить?

Ошибка класса не найдена

org/openqa/selenium/WebDriver: java.lang.NoClassDefFoundError
java.lang.NoClassDefFoundError: org/openqa/selenium/WebDriver

лямбдаошибка zip

Calling the invoke API action failed with this message: Lambda was not able to unzip the file

Зависимости, вызывающие проблему

    <dependency>
        <groupId>org.seleniumhq.webdriver</groupId>
        <artifactId>webdriver-common</artifactId>
        <version>0.9.7376</version>
    </dependency>

    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-chrome-driver</artifactId>
        <version>3.141.59</version>
    </dependency>

    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>3.141.59</version>
    </dependency>

обновлены зависимости (для Vishal)

    <dependency>
        <groupId>org.seleniumhq.webdriver</groupId>
        <artifactId>webdriver-common</artifactId>
        <version>0.9.7376</version>
    </dependency>

    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-chrome-driver</artifactId>
        <version>3.141.59</version>
    </dependency>

    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>3.141.59</version>
    </dependency>

    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-api</artifactId>
        <version>2.0rc2</version>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-remote-driver</artifactId>
        <version>3.141.59</version>
    </dependency>

    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-support</artifactId>
        <version>3.141.59</version>
    </dependency>

Конфигурация

 <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.6.0</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
          <encoding>UTF-8</encoding>
          <forceJavacCompilerUse>true</forceJavacCompilerUse>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

Ответы [ 3 ]

1 голос
/ 31 октября 2019

Я понял это. Явный селен, казалось, вызвал главную проблему. Снижение до 3.10 решило проблему, хотя я понятия не имею, почему.

1 голос
/ 31 октября 2019

Плагин Shade объединяет все зависимости с разработанным кодом и объединяет их в один Uber JAR. Недостатком является то, что он может перезаписывать файлы ресурсов и плохо работает с подписанными банками (по моему опыту, по крайней мере).

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

Тем не менее, если вам придется его использовать - возможно, проблема в объединении ресурсов jar. Есть много преобразователей, которые вы можете использовать для решения этой проблемы, и вам нужно выяснить, какой из них действительно нужен. Я бы начал с чего-то вроде этого

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.4.3</version>
    <configuration>
        <shadedArtifactAttached>true</shadedArtifactAttached>
        <shadedClassifierName>${executable.classifier}</shadedClassifierName>
        <filters>
            <filter>
                <artifact>*:*</artifact>
                <excludes>
                    <exclude>META-INF/*.SF</exclude>
                    <exclude>META-INF/*.DSA</exclude>
                    <exclude>META-INF/*.RSA</exclude>
                </excludes>
            </filter>
        </filters>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer
                        implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
                    <transformer
                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>fully.qualified.ClassName</mainClass>
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

Вы можете найти больше транформеров в плагине Apache здесь

Альтернатива, которую я бы предложил, это Spring Boot, которая используетструктура Jar-in-Jar с пользовательским ClassLoader для загрузки классов из внутреннего jar-файла.

Это более простой метод, поскольку нет необходимости перезаписывать файлы как подход к плагину Shade, и он обрабатываетзависимости немного лучше.

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>1.3.6.RELEASE</version>
    <configuration>
        <classifier>${executable.classifier}</classifier>
        <layout>ZIP</layout>
        <mainClass>fully.qualified.ClassName</mainClass>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Серьезно, взгляните на более простую конфигурацию!

ПРИМЕЧАНИЕ: Большая часть этого пришла из моих собственных заметок - номера версий могут быть немного старыми ...

1 голос
/ 25 октября 2019

Попробуйте указать ваши зависимости для вывода zip, возможно, jar что-то напутал

Добавьте это в maven-assembly-plugin конфигурацию:

     <formats>
        <format>zip</format>
     </formats>

Например:

<plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-assembly-plugin</artifactId>
     ...
     <configuration>
         ...
         <formats>
            <format>zip</format>
         </formats>
     </configuration>
</plugin>

То же самое предлагается здесь

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