2

Ich habe AWS Lambda-Funktion erstellt und jetzt versuche ich, die Bereitstellung auf AWS einzurichten. Ich habe buildspec.yml Datei mit folgendem Inhalt erstellt:AWS CodeBuild konnte kein fettes Glas erstellen

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 

Nun, wenn ich meinen Code AWS CodeCommit schieben, baut Prozess erfolgreich ausgeführt wird, aber in s3 bucket Ausgang gibt es Ausgabedatei von nur 130 kb. Das bedeutet, dass meine Abhängigkeiten von erstellte Paket fehlt, und wenn ich meine Lambda versuchen läuft Ich habe folgende Fehlermeldung:

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

In meiner pom.xml-Datei hinzugefügt ich Schatten Plugin:

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

Als ich run command mvn package auf meinem PC ist alles in Ordnung, und ich bekomme JAR-Datei mit allen meinen Abhängigkeiten (Größe ist etwas mehr als 10 MB) und wenn ich dieses Jar zu AWS Lambda-Funktion manuell bereitstellen, funktioniert alles wie erwartet.

Ich habe auch versucht, dieses Tutorial zu folgen: Link, aber nichts geändert.

Kann jemand bitte helfen, ich weiß wirklich nicht, was ich hier fehlt:/

+0

Was sagen Sie Ihren Build-Protokolle? Unterscheiden sie sich von den Protokollen auf Ihrem PC? – Unsigned

+1

Ich habe eine Lösung für das Problem gefunden. Es scheint, dass die Datei buildspec.yml (die von AWS CodeStar automatisch generiert wird) ungültig ist. Mehr hier: https://forums.aws.amazon.com/thread.jspa?threadID=255273 – newbie

Antwort

0

Während der Laufzeit der Anwendung ist nicht in der Lage das Glas zu finden.

aus dieser Antwort von Jared Genommen:

Es ist wichtig, in diesem Fall zwei verschiedene Ausnahmen gerade in unserem Kopf zu behalten:

java.lang.ClassNotFoundException Diese Ausnahme zeigt an, dass die Klasse nicht auf gefunden wurde der Klassenpfad Dies zeigt an, dass wir versucht haben, die Klassendefinition zu laden, und die Klasse im Klassenpfad nicht vorhanden war.

java.lang.NoClassDefFoundError Diese Ausnahme gibt an, dass die JVM in ihrer internen Klassendefinitionsdatenstruktur nach der Definition einer Klasse gesucht und diese nicht gefunden hat. Dies ist anders als zu sagen, dass es nicht aus dem Klassenpfad geladen werden konnte. Normalerweise zeigt dies an, dass wir zuvor versucht haben, eine Klasse aus dem Klassenpfad zu laden, aber es ist aus irgendeinem Grund fehlgeschlagen - jetzt versuchen wir es erneut, aber wir werden es nicht einmal versuchen, weil wir es früher nicht geladen haben. Der frühere Fehler könnte eine ClassNotFoundException oder ein ExceptionInInitializerError sein (was einen Fehler im statischen Initialisierungsblock anzeigt) oder irgendeine Anzahl anderer Probleme. Der Punkt ist, ein NoClassDefFoundError ist nicht unbedingt ein Klassenpfadproblem.

für Gemeinsamkeiten und Unterschiede verweisen:

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

Sie die folgende Maven Abhängigkeit in Ihrer pom-Datei verwenden können. Andernfalls können Sie die folgenden zwei Jars aus dem Netz herunterladen und zu Ihrem Build-Pfad hinzufügen.

<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 für Ihre Antwort.Ich habe Unterschiede zwischen NoClassDefFoundError und ClassNotFoundException untersucht. Dieser Fehler tritt bei log4j auf, da dies nach dem Aufruf von lmabda die erste Codezeile ist. Mein Problem, und meine Frage, glaube ich, ist sehr klar. Es scheint, dass der Code-Build von aws das Schatten-Plugin ignoriert und keine Abhängigkeiten enthält, wenn das mvn-Paket ausgeführt wird. log4j ist nur eine von vielen Abhängigkeiten, die ich in meiner Lösung habe. Durch die Größe des Ausgabepakets aus dem Code-Build ist klar, dass Abhängigkeiten nicht gepackt sind, so dass mir offensichtlich etwas fehlt. – newbie

Verwandte Themen