Jackson Databind Klassenpfadproblem

8

Ich habe eine Spring-Boot-App, die funktioniert gut, wenn ich die Bereitstellung mit "mvn clean install" in meinem lokalen, aber wenn der Krieg durch Jenkin generiert wird, wird der folgende Fehler ausgelöst.

%Vor%

Ich habe gerade versucht, die 2 War-Dateien zu vergleichen, ohne Vergleich zu verwenden, und ich sehe keinen Unterschied außer der JDK-Nebenversion, die zum Kompilieren verwendet wird.

Ich habe versucht, in meinem lokalen Build und im jenkin-Build nach der SerializationConfig.class zu suchen,

Die Ausgabe für den folgenden Befehl lautet

%Vor%

Lokaler Krieg O / P: -

%Vor%

Jenkin Krieg O / P: -

%Vor%

Grundsätzlich injiziere ich den ObjectMapper in meiner TestRestConfiguration-Klasse wie folgt,

%Vor%

Nicht sicher, warum die von Jenkin erzeugte Kriegsdatei ein Problem verursacht.

Jede Hilfe hierzu wird geschätzt.

    
user1578872 09.09.2016, 20:20
quelle

2 Antworten

7

Sie scheinen die gleiche Klasse (SerializationConfig) aus zwei verschiedenen JAR-Dateiabhängigkeiten zu ziehen. Aus Ihrer Frage ist klar, dass der in com.fasterxml.jackson.databind (der im Stack-Trace zitiert wird) entweder in der jackson-databind-2.7.3.jar oder im jersey-all-2.18.jar zu finden ist :

%Vor%

Ich würde zuerst versuchen, Ihre Abhängigkeiten so zu reduzieren, dass Sie sich entweder auf jackson-databind-2.7.3.jar oder jersey-all-2.18.jar verlassen, aber nicht auf beide. Wenn Ihre Anwendung mit dem einen oder dem anderen Programm funktioniert, vermute ich, dass dies Ihr Problem behebt (obwohl ich zugegeben habe, dass ich Spring 'Nachricht "No unique bean of type ... is defined" erwartet habe) und ich habe es nicht bemerkt in Ihrem Post).

Wie auch immer, wenn ich richtig liege, dann ist das, was Sie sehen, ein Artefakt des Klassenladens in Ihrer lokalen Umgebung, anders als das, was in dem von Jenkins generierten Artefakt passiert und auf Ihrem Server implementiert ist (zusätzliche Komplexität hier) Vielleicht möchten Sie Ihren Server auf vorhandene Bibliotheken überprüfen und genau wissen, in welcher Reihenfolge Ihre Klassen geladen werden - kein Spaß, das weiß ich).

Blick auf den Quellcode für Jacksons SerializationConfig-Klasse finde ich Folgendes, was Dinge interessant machen könnte, wenn die Klassen in den zwei verschiedenen JAR-Dateien nicht wirklich identisch sind.

%Vor%

Ich hoffe, es hilft. Viel Glück!

EDIT 1:

Es könnte interessant sein, ein Paar Builds zu erstellen, die so genannte "fat jar" -Dateien mit einigen eingebetteten Servern wie Tomcat oder Jetty erzeugen. Sie könnten etwas daraus lernen, wenn Sie das Verhalten des lokal produzierten gegen das auf Jenkins produzierte vergleichen. Siehst du das gleiche Problem? Wenn Sie die Fat Jar-Dateien verwenden, haben Sie eine explizitere Kontrolle über die bereitgestellte Umgebung als bei der Bereitstellung in einem vorhandenen (und vorkonfigurierten, änderbaren) Container.

EDIT 2:

Ein paar Dinge, die Sie tun könnten, um Ihre Umweltunterschiede herauszufinden.

%Vor%

oder, wenn Sie viel Geduld haben

%Vor%     
unigeek 12.09.2016, 18:27
quelle
2

Sind Sie sicher, dass Jenkins den Build bereinigt, d. h. dass er "mvn clean install" und nicht nur "mvn install" aufruft? Sobald ich "mvn clean install" auf meinem lokalen Computer verwendet habe, ist die Ausnahme verschwunden und die App wurde erfolgreich gestartet.

%Vor%     
pingpong 14.07.2017 12:11
quelle

Tags und Links