[英]AWS Lambda Jar unable to zip after adding selenium dependencies in pom
这是一个奇怪的错误。 将 selenium 依赖项添加到我的 maven 项目的 pom 并将其上传到 lambda 后,它说无法解压缩文件。 然而,在删除依赖项后,lambda 能够很好地解压缩文件(但是它提供了之后没有找到的 class)。 我曾尝试一一删除依赖项,但每一个都会触发错误。
关于如何解决这个问题的任何想法?
Class 未找到错误
org/openqa/selenium/WebDriver: java.lang.NoClassDefFoundError
java.lang.NoClassDefFoundError: org/openqa/selenium/WebDriver
lambda 无法 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>
试着告诉你对 output 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>
这里也建议
我想到了。 java selenium 似乎导致了主要问题。 降级到 3.10 解决了这个问题,虽然我不知道为什么。
shade 插件将所有依赖项与开发的代码结合在一起,并将它们放在一个 Uber JAR 中。 缺点是它可以覆盖资源文件,并且不能很好地与签名的 jars 配合使用(至少根据我的经验)。
如果可能的话,我会建议远离阴影插件。
也就是说,如果您必须使用它 - 您的问题可能在于结合 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>
说真的,看看更简单的配置!
注意:大部分来自我自己的笔记 - 版本号可能有点旧......
这是由于存在您的代码所依赖的 class 文件并且在编译时找到但在运行时未找到时引起的。 寻找构建时间和运行时类路径的差异。
如果您需要此插件来创建 zip 而不是 jar,则值得检查。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
...
<configuration>
...
<formats>
<format>zip</format>
</formats>
</configuration>
</plugin>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.