AWS CodeBuild 未能创建 Fat jar
AWS CodeBuild failed to create 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 的输出文件。这意味着创建的包中缺少我的依赖项,并且当我尝试 运行ning 我的 Lambda 时出现以下错误:
Error loading class 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功能一切正常。
我也尝试按照本教程进行操作:Link,但没有任何改变。
有人可以帮忙吗,我真的不知道我在这里错过了什么:/
在运行时,您的应用程序无法找到 jar。
摘自 Jared 的回答:
在这种情况下,请务必牢记两个不同的例外情况:
java.lang.ClassNotFoundException 此异常表示在 class 路径上找不到 class。这表明我们正在尝试加载 class 定义,而 class 在 class 路径上不存在。
java.lang.NoClassDefFoundError 此异常表明 JVM 在其内部 class 定义数据结构中查找 class 的定义,但没有找到它。这不同于说无法从 class 路径加载它。通常这表示我们之前尝试从 class 路径加载 class,但由于某种原因失败了 - 现在我们再次尝试,但我们甚至不打算尝试加载它,因为我们之前加载失败。较早的失败可能是 ClassNotFoundException 或 ExceptionInInitializerError(表示静态初始化块中的失败)或任何数量的其他问题。关键是,NoClassDefFoundError 不一定是 class路径问题。
异同请参考:
What causes and what are the differences between NoClassDefFoundError and ClassNotFoundException?
您可以在 pom 文件中使用以下 maven 依赖项。否则,您可以从网上下载以下两个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>
我已经创建了 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 的输出文件。这意味着创建的包中缺少我的依赖项,并且当我尝试 运行ning 我的 Lambda 时出现以下错误:
Error loading class 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功能一切正常。
我也尝试按照本教程进行操作:Link,但没有任何改变。
有人可以帮忙吗,我真的不知道我在这里错过了什么:/
在运行时,您的应用程序无法找到 jar。
摘自 Jared 的回答:
在这种情况下,请务必牢记两个不同的例外情况:
java.lang.ClassNotFoundException 此异常表示在 class 路径上找不到 class。这表明我们正在尝试加载 class 定义,而 class 在 class 路径上不存在。
java.lang.NoClassDefFoundError 此异常表明 JVM 在其内部 class 定义数据结构中查找 class 的定义,但没有找到它。这不同于说无法从 class 路径加载它。通常这表示我们之前尝试从 class 路径加载 class,但由于某种原因失败了 - 现在我们再次尝试,但我们甚至不打算尝试加载它,因为我们之前加载失败。较早的失败可能是 ClassNotFoundException 或 ExceptionInInitializerError(表示静态初始化块中的失败)或任何数量的其他问题。关键是,NoClassDefFoundError 不一定是 class路径问题。
异同请参考:
What causes and what are the differences between NoClassDefFoundError and ClassNotFoundException?
您可以在 pom 文件中使用以下 maven 依赖项。否则,您可以从网上下载以下两个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>