Problem z wygenerowanym fat jar - Multiple SLF4J Bindings

0

Witam,

mam pewien problem z wygenerowanym fat jarem za pomocą Maven-Assembly-Plugin. Błąd jest nie do końca dla mnie zrozumiały i wyczerpałem swoje pomysły,
dlatego postanowiłem poprosić o pomoc bardziej doświadczonych kolegów.
Mam projekt w Javia + Maven. Wykorzystuje inne zewnętrzne biblioteki w tym Apache Camel, choć nie wiem, czy to ma znaczenie.
Podczas zwykłego uruchomienia w IntelijIDEA, wszystko jest ok, 0 błędów.
Problem pojawia się już po wygenerowaniu fat jara. Gdy uruchamiam go już na wstępie dostaję 2 Warningi:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in: BOOT-INF/classes!/org/slf4j/impl/StaticLoggerBinder.class
SLF4J: Found binding in: BOOT-INF/lib/slf4j-log4j12-1.7.30.jar!/org/slf4j/impl/StaticLoggerBinder.class
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory

W pom.xml mam:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.32</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.6.1</version>
</dependency>

slf4j-api automatycznie zaciąga org.slf4j:slf4j-api

W samej aplikacji bezpośrednio korzystam z Log4j.
Gdzie może tkwić problem? Jedyne co mi przychodzi to fakt, że ja korzystam z log4j bezpośrednio, a np Apache Camel z slf4j, ale czy to może być przyczyną?

//Edit - dodatkowe informacje:
Korzystałem z mvn clean dependency:tree i szukałem po frazach "log" "slf" I nie znalazło mi nic prócz tych wyżej wymienionych.
Aplikacja korzysta z komponentów Springa, ale jest to zwykła javowa - bez adnotacji SpringBootApplication, zwykły public static void main (nie wiem, jak to inaczej nazwać, więc przepraszam za takie wyjaśnienie)

Za pomoc z góry dziękuje.

2

Przeanalizuj jakie masz biblioteki przy pomocy mvn dependency:tree.

Jakiś lib dorzuca ci dodatkowy binding

1

Dobra, a nie jest tak, że ty po zbudowaniu tego fatjara odpalasz go i tak z katalogiem z libami na classpath i dostarczasz implementacje 2x - raz z wewnątrz fatjara, raz z zewnatrz?
Jak już masz fatjara to nie musisz mu dorzucać zaleznosci.

W logu który wkleiles widać że jedno leci z .jar drugie z /classes

3

Dobra, teraz zajarzyłem. wczoraj już było za późno. ;-)

To jest apka spring bootowa, tak?
Jeżeli tak to spring-boot-maven-plugin sam robi fatjara pakując zależności do katalogu /lib.
Jeżeli użyłeś oprócz tego maven-assembly-plugin to ten z kolei tworzy fatjara rozpakowując wszystkie jary bezpośrednio do katalogu classess.

Końcowo dostajesz fatjara w fatjarze i wszystkie klasy masz zdublowane - nie tylko slf4j - rozpakuj sobie wynikowego jara i sprawdź.

Jak dla mnie maven-assembly-plugin do wywalenia jak jest spring-boot-maven-plugin.

0

Stwierdziłem, że wypowiem się dodatkowo w osobnym wpisie, zamiast w komentarzu

@opiszon: przepraszam, nie wyraziłem się dokładnie. Aplikacja jest Javowa - public static void main. Bez adnotacji SpringBootApplication (bo chyba to masz na myśli) ?
W projekcie mam dwie zależności SpringBoot, reszta to jest Spring (który jest wykorzystywany przez Apache Camel - Spring-context etc
Dodatkowo w pom.xml mam zdefiniowany <parent> ( właśnie do jednej zależności SpringBoot).
Na początku myślałem, że nie mam spring-boot-maven-plugin, ale jak o tym wspomniałeś, to stwierdziłem, że zerknę i faktycznie jest, ale nie wprost zadeklarowany. Musiał zostać zaciągnięty z <parent> ( bo jest to chyba możliwe) @opiszon popraw mnie proszę, jeśli się mylę.

Po usunięcie maven-assembly-plugin i zadeklarowaniu spring-boot-maven-plugin (zadeklarowałem, aby podać mu klasę Main, ponieważ tak jak wspomniałem, nie jest oznaczona adnotacją SpringBootApplication rozmiar JAR zmniejszył się dwukrotnie.
Więc jest pewnie, tak jak napisałeś, zdublowane zależności. Choć dziwne, że podana ścieżka do StaticLoggerBinder.class, dlatego się nie spodziewałem.

Problem rozwiązany, choć aktualnie nie wszystko jest jeszcze w pełni jasne dla mnie, ale to już pogrzebie w własnym temacie i ewentualnie zwrócę się tutaj, jeśli coś nie będzie jasne..

Dzięki bardzo

1

Tak, pluginy też są zaciągane z parent poma.

To że apka spring-bootowa domniemywalem po scieżce "BOOT-INF"

1 użytkowników online, w tym zalogowanych: 0, gości: 1