【问题标题】:AWS CodeBuild failed to create Fat jarAWS CodeBuild 无法创建 Fat jar
【发布时间】:2017-07-01 15:24:22
【问题描述】:

我已经创建了 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: 类 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>

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

我也尝试按照本教程进行操作:Link,但没有任何改变。

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

【问题讨论】:

  • 你的构建日志是怎么说的?它们与您 PC 上的日志不同吗?
  • 我找到了问题的解决方案。 buildspec.yml 文件(由 AWS CodeStar 自动生成)似乎无效。更多信息:forums.aws.amazon.com/thread.jspa?threadID=255273

标签: maven aws-lambda maven-shade-plugin uberjar aws-codebuild


【解决方案1】:

在运行时,您的应用程序无法找到 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 依赖项。否则,您可以从网上下载以下两个 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>

【讨论】:

  • Tnx 等待您的回复。我确实研究了 NoClassDefFoundError 和 ClassNotFoundException 之间的差异。 log4j 出现此错误,因为在调用 lmabda 后这是第一行代码。我的问题,我的问题,我相信很清楚。在执行 mvn package 时,aws code build 以某种方式忽略了 shade 插件并且不包括依赖项。 log4j 只是我的解决方案中的众多依赖项之一。通过代码构建的输出包的大小,很明显依赖项没有被打包,所以我显然遗漏了一些东西。
猜你喜欢
  • 2013-02-18
  • 2021-09-29
  • 2018-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
  • 2019-12-01
相关资源
最近更新 更多