AWS CodeBuild не удалось создать толстую банку

Я создал функцию 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 КБ. Это означает, что в созданном пакете отсутствуют мои зависимости, и когда я пытаюсь запустить свою лямбду, я получаю следующую ошибку:

Ошибка при загрузке класса 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>

Когда я запускаю команду mvn package на своем ПК, все в порядке, и я получаю файл jar, содержащий все мои зависимости (размер немногим более 10 МБ), и если я вручную развертываю этот jar в лямбда-функции AWS, все работает, как и ожидалось.

Я также пытался следовать этому руководству: Ссылка, но ничего не изменилось.

Может кто-нибудь помочь, я действительно не знаю, что мне здесь не хватает:/


person newbie    schedule 01.07.2017    source источник
comment
Что говорят ваши журналы сборки? Отличаются ли они от журналов на вашем ПК?   -  person Unsigned    schedule 02.07.2017
comment
Я нашел решение проблемы. Похоже, что файл buildspec.yml (автоматически созданный AWS CodeStar) недействителен. Подробнее здесь: forums.aws.amazon.com/thread.jspa?threadID=255273   -  person newbie    schedule 02.07.2017


Ответы (1)


Во время выполнения ваше приложение не может найти банку.

Взято из этого ответа Джареда:

В этом случае важно помнить о двух разных исключениях:

java.lang.ClassNotFoundException Это исключение означает, что класс не был найден в пути к классам. Это указывает на то, что мы пытались загрузить определение класса, а класс не существовал в пути к классам.

java.lang.NoClassDefFoundError Это исключение указывает на то, что JVM искала в своей внутренней структуре данных определения класса определение класса и не нашла его. Это отличается от того, что он не может быть загружен из пути к классам. Обычно это указывает на то, что мы ранее пытались загрузить класс из пути к классам, но по какой-то причине это не удалось — теперь мы пытаемся снова, но даже не собираемся пытаться загрузить его, потому что ранее у нас не получилось загрузить его. Предыдущий сбой мог быть ClassNotFoundException или ExceptionInInitializerError (указывающим на сбой в статическом блоке инициализации) или любым другим количеством проблем. Дело в том, что NoClassDefFoundError не обязательно является проблемой пути к классам.

сходства и различия см.:

Каковы причины и каковы различия между NoClassDefFoundError и ClassNotFoundException?

Вы можете использовать следующую зависимость maven в вашем файле pom. В противном случае вы можете загрузить следующие два 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>
person Anshul Sharma    schedule 01.07.2017
comment
Спасибо за ваш ответ. Я изучал различия между NoClassDefFoundError и ClassNotFoundException. Эта ошибка появляется для log4j, потому что после вызова lmabda это первая строка кода. Моя проблема и мой вопрос, я думаю, очень ясны. Похоже, что сборка кода aws каким-то образом игнорирует плагин тени и не включает зависимости при выполнении пакета mvn. log4j — это только одна из многих зависимостей, которые есть в моем решении. По размеру выходного пакета из сборки кода видно, что зависимости не упакованы, так что я явно что-то упускаю. - person newbie; 01.07.2017