AWS CodeBuild 无法创建 Fat jar



我已经创建了AWS Lambda函数,现在我正在尝试在AWS上设置部署。我创建了包含以下内容的buildspec.yml文件:

version: 0.1
phases:
build:
commands:
- echo Entering build phase...
- echo Build started on `date`
- mvn package shade:shade
- mv target/classes/* .
- rm -rf target src buildspec.yml pom.xml
- aws cloudformation package --template template.json --s3-bucket $S3_BUCKET --output-template template-export.json
artifacts:
type: zip
files:
- template-export.json

现在,当我将代码推送到 AWS CodeCommit 时,构建过程已成功运行,但在输出 s3 存储桶中,输出文件只有 130 kb。这意味着创建的软件包中缺少我的依赖项,当我尝试运行我的 Lambda 时,出现以下错误:

加载类 com.test.handler 时出错: org/apache/log4j/Logger: class java.lang.NoClassDefFoundError

在我的pom.xml文件中,我添加了阴影插件:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>

当我在我的 PC 上运行命令mvn package时一切正常,我得到包含我所有依赖项的 jar 文件(大小略高于 10mb(,如果我手动将此 jar 部署到 AWS lambda 函数,一切都按预期工作。

我也尝试遵循本教程:链接,但没有任何变化。

有人可以帮忙吗,我真的不知道我在这里错过了什么:/

在运行时,应用程序无法找到 jar。

摘自贾里德的这个答案:

在这种情况下,重要的是要在我们的脑海中保持两个不同的例外:

java.lang.ClassNotFoundException 此异常表示在类路径上找不到该类。这表明我们尝试加载类定义,并且类路径上不存在该类。

java.lang.NoClassDefFoundError 此异常表示 JVM 在其内部类定义数据结构中查找了类的定义,但没有找到它。这与说它无法从类路径加载不同。通常,这表示我们之前尝试从类路径加载类,但由于某种原因失败 - 现在我们再次尝试,但我们甚至不会尝试加载它,因为我们之前加载它失败了。较早的失败可能是 ClassNotFoundException 或 ExceptionInInitializerError(指示静态初始化块中的故障(或任何其他问题。关键是,NoClassDefFoundError 不一定是类路径问题。

有关异同,请参阅:

NoClassDefFoundError 和 ClassNotFoundException 之间有哪些原因和区别?

您可以在 pom 文件中使用以下 maven 依赖项。否则,您可以从 net 下载以下两个 jar 并将其添加到您的构建路径中。

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.4</version>

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.4</version>
</dependency>

最新更新