Różne wersje libów a ClassNotFoundException

Różne wersje libów a ClassNotFoundException
PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:4 miesiące
  • Postów:2787
0

Siema, pierwsze raz zakładam wątek w tym dziale, ale czy kojarzycie jak możnaby rozwiązać następujący problem:

  1. Deployuję plik .war na serwery aplikacyjne, takie jak Jboss czy WebSphere
  2. W tym warze są pewne liby w wersjach innych niż gdzieś tam już istniejące na tych serwerach, przez co lecą NoSuchMethodException i inne pierdy
  3. Podmiana liba w pliku war na liba w wersji z serwera nic nie zmienia
  4. Usunięcie liba z wara powoduje ClassNotFoundException

help :D @jarekr000000 @scibi92 @Shalom

edytowany 1x, ostatnio: Pinek
S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
0

A to jakaś aplikacje JEE czy Spring?


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
SH
  • Rejestracja:około 7 lat
  • Ostatnio:około 5 lat
  • Postów:29
1

Twoja apka potrzebuje twojego jara, a używa jara z serwera, który jest 'stary'. Wsadzenie do apki jara z serwera nic nie daje bo to twój jest ten 'lepszy', mógłbyś podmienić jar na serwerze na ten swój, ale nie rób tak :D

Ja w swoim projekcie używam guavy 23.0, na weblogicu, na który deployuje jest guava bodajże 12.0 i jakbym nic nie zrobił to ona będzie domyślnie użyta i dostanę tonę błędów. Dlatego mam takie coś:

Kopiuj
<prefer-application-packages>
	<package-name>com.google.*</package-name>
    <package-name>org.jboss.logging.*</package-name>
</prefer-application-packages>

Nie napisałeś jakiego konkretnie używasz, ale na Websphere czy Jboss sa pewnie podobne możliwości.

edytowany 1x, ostatnio: Shadov
PI
Dobre, dobre, dzięki za radę. Nie wiem jaki jest odpowiednik tego np na WebSphere, ale to poszukam
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Generalnie ciężko. Używaj wersji które masz z sewerem. Cudowanie z ustawianiem preferencji, jak powyżej, jest ryzykowne bo pewnie jakieś inne paczki od tego zalezą i nadal będą latać wyjątki że sygnatury nie pasują.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
PI
Nom już też tak miałem wcześniej, podczas prób :/
YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:12 dni
  • Postów:2370
0

Na WebSphere masz możliwość skonfigurowania class loaderów i wskazania czy klasa ma być wyszukiwana w parent class loaderze czy w class loaderze aplikacji.
Dodatkowo jeśli na WS są zdeployowane biblioteki współdzielone, to aplikacja powinna być skojarzona z taką bibliotekę współdzieloną (o ile chcesz korzystać z tej wersji współdzielonej... )

edytowany 1x, ostatnio: yarel
PI
Spróbowałem, niestety bez zmian.
YA
Jak wygląda u Ciebie procedura deploymentu? Jak wygląda deskryptor ewentualnie co klikasz i która wersja WS?
PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:4 miesiące
  • Postów:2787
0

@yarel: WebSphere 9, deploy polega na tym że wchodzę na consolę WS w chromie i idę do Enterprise aplication types -> install i wybieram mój war. Deploy sam w sobie jest owocny, ale później podczas próby startu owej aplikacji, są te błędy

YA
A jak zmieniasz politykę dla classloadera?
PI
No właśnie zmieniłem order, że wpierw patrzy na classloadera apki a potem dopiero parenta - to samo
PI
Wchodzę w aplikację -> class loading and update detection -> Class loader order i zmieniłem na to drugie
YA
A w servers -> Twój server -> Java and process mgmt -> classloaders co masz?
PI
nie mam tam nic ;D
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4708
0

To by trzeba rozważać przypadek po przypadku. Jaki jar, jakie błędy?
Dorzucasz liby mavenem?
To pewnie razem z twoim jarem dobierają się inne, które powodują konflikty.
Wtedy robisz exclusions, w najgorszym razie ręcznie wybierasz jara przez <system>/ path (straszny syf - dawno tak nie musiałem).

Czasem rozwiązanie to nawet podmiana jarów na serwerze (i jboss, i websphere ma koncept takich ext (shared) billiotek - względnie cywilizowany).

Tak ogólnie bez konkretu to jedyne co mogę poradzić to 1850 EURa za dzień + koszty transportu, przylatuje i rozwiązuję. Dzień raczej starczy w typowym projekcie. Chyba, że to dym na skraju JSF + Bean Validation - wtedy pewnie dwa dni :-)

Ktoś tam pewnie wybrał tego webshera i musiał raczej wiedzieć, że to płatne rozwiązanie. Płacisz albo krwią programistów, albo kasą dla konsulatantów - przeważnie w obu walutach.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 4x, ostatnio: jarekr000000
PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:4 miesiące
  • Postów:2787
0
jarekr000000 napisał(a):

To by trzeba rozważać przypadek po przypadku. Jaki jar, jakie błędy?
Dorzucasz liby mavenem?
To pewnie razem z twoim jarem dobierają się inne, które powodują konflikty.
Wtedy robisz exclusions, w najgorszym razie ręcznie wybierasz jara przez <system>/ path (straszny syf - dawno tak nie musiałem).

Czasem rozwiązanie to nawet podmiana jarów na serwerze (i jboss, i websphere ma koncept takich ext (shared) billiotek - względnie cywilizowany).

Tak ogólnie bez konkretu to jedyne co mogę poradzić to 1850 EURa za dzień + koszty transportu, przylatuje i rozwiązuję. Dzień raczej starczy w typowym projekcie. Chyba, że to dym na skraju JSF + Bean Validation - wtedy pewnie dwa dni :-)

Ktoś tam pewnie wybrał tego webshera i musiał raczej wiedzieć, że to płatne rozwiązanie. Płacisz albo krwią programistów, albo kasą dla konsulatantów - przeważnie w obu walutach.

  • Mavenowy exclusions zrobi to samo co ręczne usunięcie jara, więc ClassNotFoundExceptions
  • No właśnie nie powinienem ruszać jarów na serwerze
  • Chciałbym mieć twoją dniówkę :)

EDIT:

  • jar to apache lang3, błąd jest java.lang.NoSuchMethodError: org/apache/commons/lang3/StringUtils.removePattern.
edytowany 2x, ostatnio: Pinek
jarekr000000
To i tak dla firmy. Dla mnie ochłapy :-)
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4708
0

jar to apache lang3, błąd jest java.lang.NoSuchMethodError: org/apache/commons/lang3/StringUtils.removePattern

Jeszcze nie napisałeś skąd to leci, kto wywołuje. W sumie ważne.

Ale pierwszy hint - musisz mieć wersję co najmniej 3.2, żeby ta metoda była.

Kopiuj
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.2.1</version>
</dependency>

jeden i pół terabajta powinno wystarczyć każdemu
Zobacz pozostałe 4 komentarze
PI
Na serwie było w katalogu WebSpherowym System. Problem też jest taki, że jeśli chodzi o jara, który potrzebuje tej minimum 3.2 wersji, to nie mogę jego wersji obniżyć, bo coś tam było ustalone :D
jarekr000000
Coś dziwnego. Ten z (System??) nie powinien Ci przeszkadzać. Powinieneś normalnie mieć jara w wersji 3.2 lb wyżej w WARze i parent last powinno zalatwić. Normalnie to sprawdzam jeszcze na debugu z jakiego classloadera faktycznie klasa pochodzi - Class.forName('....tu moja klasa').getClassloader() - coby potwierdzić skąd się gówienko bierze.
PI
No cóż... anyway, dzięki za zaangażowanie
jarekr000000
@Pinek jakie anyway? Jest problem to trzeba rozwiązać. Jesteśmy inżyniery. Na razie jeszcze nie wiem co Ci bruździ - ale po nice do kłębka da się dojść - tylko trzeba wyjaśnić konkretnie, który jar masz gdzie.
PI
Myślałem że zamiana orderu classloaderów coś wskóra, ale nic nie dała.. a w zbytnie szczegóły nie chcę wchodzić, NDA i te sprawy ;)
jarekczek
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Siemianowice Śląskie
  • Postów:500
0

A czy rozwiązaniem problemu nie jest EAR i zdefiniowanie pod niego bibliotek? Coś mi chodzi po głowie, że takie rzeczy były w dokumentacji WebLogica, więc pewnie na WAS-ie też są.


Przeważnie ignoruję niezarejestrowanych użytkowników.
jarekr000000
WAR powinien tak samo mieć swoje biblioteki i własny classloader. (ale fakt, że akurat pod WASem to prawie zawsze z EARami walczyłem i nie wiem na 100% czy WARy nie mają tam jakiegoś ograniczenia - nie sądze). W każdym razie - ten (lub podobny) problem z commons lang3 to na 99% już miałem w jakimś EARze właśnie)
PI
Jak na konsoli WAS wybieram wara, to ostatecznie on jest i tak wrapowany jakoś do eara już przez WASa
PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:4 miesiące
  • Postów:2787
0

@jarekr000000: Ogólnie to sprawę komplikuje fakt, że war który chcę zdeployować, nie jest napisany przeze mnie... to jest war pewnej third party biblioteki, które w sobie ma oczywiście jakieś tam liby i wśród nich są jary commons lang3 i commons lang. Co gorsze, najstarsza wersja tej third party biblioteki, wciąż zawiera commons lang3 w wersji powyżej 3.1

edytowany 1x, ostatnio: Pinek
jarekr000000
To jeszcze może być tak , że WAR zawiera pliki bm--ext.xmi ibm--bnd.xmi, które mają opisane jak ustawiać classloader. Nie pamiętam co ma pierwszeństwo i czy w oogle da się to overidować jak jest tam ustawione.
PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:4 miesiące
  • Postów:2787
0

Hmm niczego takiego @jarekr000000 w WARzie nie znalazłem, ale w logach widzę że

Kopiuj
Parent: com.ibm.ws.classloader.CompoundClassLoader@...
Delegation Mode: PARENT_FIRST

Czyli mimo że w konsoli WASa zmieniłem dla tejże aplikacji z parent first na parent last, to właśnie jakby nie zadziałało ustawienie tego (cały server też restartowałem)

EDIT:
Elegancko, haha :D Do tej pory zmieniałem na PARENT_LAST z poziomu aplikacji, teraz zmieniłem z poziomu modułu (jeden poziom niżej) i chyba widzi, bo już są inne błędy :)
javax.servlet.ServletContainerInitializer: Provider org.apache.logging.log4j.web.Log4jServletContainerInitializer not a subtype
Ale ważne że krok naprzód. Mega się cieszę!!!

EDIT2:
Na http://www-01.ibm.com/support/docview.wss?uid=swg1PI67363 niby piszą że trzeba kolejnej wersji WASa... ale nie jestem pewien czy czegoś innego nie wystarczy zrobić

edytowany 4x, ostatnio: Pinek
jarekr000000
Krok po kroku i zostaniesz specem od Websphera - to szybko idzie...
PI
haha nie zamierzam się z tym dłużej babrać
SH
Ja tak mówiłem o Weblogicu prawie 2 lata temu.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.