我创建了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文件中,我添加了shade插件:
<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>
当我在我的电脑上运行命令mvn package
时,一切正常,我得到包含所有依赖项的jar文件(大小超过10mb),如果我手动将此jar部署到AWS lambda函数,一切都按预期工作
我也尝试过本教程:Link,但没有任何改变。
有人可以帮忙,我真的不知道我在这里缺少什么:/
答案 0 :(得分:0)
在运行期间,您的应用程序无法找到jar。
取自Jared的回答:
在这种情况下,重要的是要保持两个不同的例外:
java.lang.ClassNotFoundException此异常表示在类路径中找不到该类。这表明我们正在尝试加载类定义,并且该类在类路径中不存在。
java.lang.NoClassDefFoundError此异常指示JVM在其内部类定义数据结构中查找类的定义但未找到它。这与说它无法从类路径加载不同。通常这表明我们之前尝试从类路径加载一个类,但由于某种原因它失败了 - 现在我们再次尝试,但我们甚至都不会尝试加载它,因为我们之前没有加载它。较早的失败可能是ClassNotFoundException或ExceptionInInitializerError(表示静态初始化块中的失败)或任何其他问题。关键是,NoClassDefFoundError不一定是类路径问题。
相似之处和不同之处请参考:
What causes and what are the differences between NoClassDefFoundError and 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>