在 pom 中添加硒依赖项后,AWS Lambda Jar 无法压缩

Posted

技术标签:

【中文标题】在 pom 中添加硒依赖项后,AWS Lambda Jar 无法压缩【英文标题】:AWS Lambda Jar unable to zip after adding selenium dependencies in pom 【发布时间】:2020-02-15 05:48:24 【问题描述】:

这是一个奇怪的错误。将 selenium 依赖项添加到我的 maven 项目的 pom 并将其上传到 lambda 后,它说它无法解压缩文件。然而,在删除依赖项之后,lambda 能够很好地解压缩文件(但是它会提供一个之后找不到的类)。我试过一一删除依赖,但每一个都会触发错误。

关于如何解决这个问题的任何想法?

找不到类错误

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

lambda 无法压缩错误

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>

【问题讨论】:

我现在已将 jars 添加为单独的依赖项,但仍然遇到问题 我认为 chromedriver 依赖项搞砸了。您可以尝试一次不使用 chrome 驱动程序吗?如果可行,请尝试更改 chrome 驱动程序依赖项的版本 @Vishal 无论是否依赖 chrome,它仍然会出现解压缩错误 尝试在你的 pom 中包含这个:Selenium-api 除了 selenium-java-,您可能还需要:selenium-remote-driver-.jar 和 selenium-support-.jar。你已经有的罐子。但是先试试上面的那个。因为硒存在传递依赖关系。还要确保在运行 lambda 之前执行 mvn install 【参考方案1】:

shade 插件将所有依赖项与开发的代码结合起来,并将它们放入一个 Uber JAR 中。缺点是它可以覆盖资源文件,并且不能很好地与签名的 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 插件 here 上找到更多转换器

我建议的替代方案是 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>

说真的,看看更简单的配置!

注意:大部分来自我自己的笔记 - 版本号可能有点旧......

【讨论】:

我不确定这是否是真正的答案,因为我不需要使用这种方法(请参阅我的答案)。我宁愿坚持使用带阴影的罐子,因为这似乎有效。但是,您的答案很详细,并且您清楚地知道自己在说什么,因此我将其标记为正确【参考方案2】:

试着告诉你的依赖输出 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>

同样建议here

【讨论】:

您能否使用我的问题中提供的 pom 提供更多详细信息,因为我使用的是 shade 插件而不是程序集 有什么理由需要使用阴影吗? Shade 旨在创建一个 uber-jar,因此可能很难管理。我认为应该很容易使用汇编来代替它并使其工作。对不起,我现在没有任何 lambda 可用 maven 准备好,所以我无法测试自己:/ 在创建 jar 时,我按照 AWS 官方演练进行了设置,并且我认为它可以节省空间,但是如果没有它也可以工作,那么我就不需要它。你能否更新你的答案,我应该如何格式化它,以便我可以测试你的答案?【参考方案3】:

我想通了。 java selenium 似乎导致了主要问题。降级到 3.10 解决了这个问题,虽然我不知道为什么。

【讨论】:

以上是关于在 pom 中添加硒依赖项后,AWS Lambda Jar 无法压缩的主要内容,如果未能解决你的问题,请参考以下文章

添加执行器的依赖项后,Spring Boot 无法正常工作

pom.xml 每次添加新依赖时都会出错

无法从 AWS Lambda 连接到 AWS RDS MySql DB。 ClassNotFoundException:com.mysql.jdbc

如何使用依赖项创建AWS nodejs lambda函数

如何使用 Java + ChromeDriver 在 AWS Lambda 中运行 Google Chrome 进行 Selenium 测试

添加 cocoapods 依赖项后,Fastlane 健身房失败