2

J'ai créé la fonction AWS Lambda et j'essaie maintenant de configurer le déploiement sur AWS. J'ai créé le fichier buildspec.yml avec le contenu suivant:AWS CodeBuild n'a pas pu créer le fichier Fat Jar

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 

Maintenant, quand je pousse mon code à AWS CodeCommit, processus de construction est exécuté avec succès, mais dans un seau de sortie s3 il y a fichier de sortie de seulement 130 kb. Cela signifie que mes dépendances sont absents du paquet créé, et quand j'essayer d'exécuter mon Lambda je me suis erreur suivant:

Error loading class com.test.handler: org/apache/log4j/Logger: class java.lang.NoClassDefFoundError

Dans mon fichier pom.xml j'ai ajouté plugin ombre:

<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> 

Quand je exécuter la commande mvn package sur mon PC tout est OK et j'obtiens le fichier jar contenant toutes mes dépendances (la taille est un peu plus de 10mb) et si je déploie manuellement ce jar à la fonction AWS lambda tout fonctionne comme prévu.

J'ai également essayé de suivre ce tutoriel: Link, mais rien n'a changé.

Quelqu'un peut-il s'il vous plaît aider, je ne sais vraiment pas ce que je suis absent ici:/

+0

Qu'est-ce que votre construction disent les journaux? Sont-ils différents des journaux sur votre PC? – Unsigned

+1

J'ai trouvé une solution au problème. Il semble que le fichier buildspec.yml (généré automatiquement par AWS CodeStar) n'est pas valide. Plus ici: https://forums.aws.amazon.com/thread.jspa?threadID=255273 – newbie

Répondre

0

lors de l'exécution de votre application ne peut pas trouver le pot.

Tiré de cette réponse par Jared:

Il est important de garder deux exceptions différentes droites dans notre tête dans ce cas:

java.lang.ClassNotFoundException Cette exception indique que la classe n'a pas été trouvé sur le chemin de classe. Cela indique que nous essayions de charger la définition de classe, et que la classe n'existait pas sur le chemin de classe. Java.lang.NoClassDefFoundError Cette exception indique que la JVM a regardé dans sa structure de données de définition de classe interne pour la définition d'une classe et ne l'a pas trouvée. Ceci est différent de dire qu'il n'a pas pu être chargé à partir du classpath. Cela indique généralement que nous avons précédemment tenté de charger une classe à partir du classpath, mais il a échoué pour une raison quelconque - nous essayons à nouveau, mais nous n'allons même pas essayer de le charger, car nous avons échoué à le charger plus tôt. L'échec antérieur peut être une exception ClassNotFoundException ou une erreur ExceptionInInitializerError (indiquant une défaillance dans le bloc d'initialisation statique) ou un nombre quelconque d'autres problèmes. Le point est, un NoClassDefFoundError n'est pas nécessairement un problème de classpath.

des différences et des similitudes se réfèrent:

What causes and what are the differences between NoClassDefFoundError and ClassNotFoundException?

Vous pouvez utiliser la dépendance maven suivante dans votre fichier pom. Sinon, vous pouvez télécharger les deux fichiers jar suivants à partir du réseau et l'ajouter à votre chemin de compilation.

<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> 
+0

Tnx pour votre réponse.J'ai étudié les différences entre NoClassDefFoundError et ClassNotFoundException. Cette erreur apparaît pour log4j car après l'appel de lmabda, il s'agit de la première ligne de code. Mon problème, et ma question, je crois est très clair. Il appert que la construction du code aws ignore en quelque sorte le plugin de couleur et n'inclut pas les dépendances quand le paquet mvn est exécuté. log4j n'est qu'une des nombreuses dépendances que j'ai dans ma solution. Par la taille du paquet de sortie de la construction du code, il est clair que les dépendances ne sont pas emballées, donc il me manque évidemment quelque chose. – newbie