Mam aplikację internetową, która wykorzystała w porządku na wielu serwerach internetowych (Tomcat, JBoss, Weblogic i WebSphere). Teraz jednak ma błąd podczas wdrażania na WebSphere 9.

Aplikacja zawiera jar javax.transaction-API-1.2. Niektóre z jego klas, np. javax.transaction.xa.XAResource, są również zawarte w Javie SE, ale nie wszystkie z nich. Niektóre są specyficzne dla Java EE i są wymagane przez niektóre biblioteki 3RD-Party w mojej aplikacji. Aplikacja jest zawsze wdrażana z First-First-First-Last-Last) Classloader. WebSphere 9 rzuca ten błąd podczas uruchamiania, gdy aplikacja próbuje załadować sterownik Oracle JDBC:

java.lang.LinkageError: loading constraint violation: loader "com/ibm/ws/classloader/CompoundClassLoader@7157be44" previously initiated loading for a different type with name 
"javax/transaction/xa/XAResource" defined by loader "com/ibm/oti/vm/BootstrapClassLoader@422c7b1b"

Zauważ, że nie używamy transakcji XA w aplikacji, używamy regularnych transakcji.

Na innych serwerach i poprzednie wersje WebSphere, nigdy nie był problem. Serwer nie obchodzi mnie, że ładujemy XAResource od wewnątrz wojny, nawet jeśli był wcześniej załadowany gdzieś na serwerze. Teraz WebSphere 9 jest inny, mówi, że klasa App Classloader już załadował tę klasę z serwera, ale nie wiem, dlaczego lub kiedy to się stało.

Masz jakiś pomysł, jak to rozwiązać?

0
Yoni 24 marzec 2020, 03:40

2 odpowiedzi

Najlepsza odpowiedź

Na koniec wykonaliśmy dwie rzeczy do rozwiązania tego problemu.

1) uaktualniliśmy jarze JTA do wersji 1.3 (link Tutaj ). Ten słoik rozwiązuje problem, unikając duplikatów klas - zawiera tylko klasy J2ee i pomija klasy J2SE, które są już zawarte w JVM. 2) Zaktualizowaliśmy WebSphere Server od 9.0.0.7 do 9.0.0.11.

W tym czasie podejrzewałem, że tylko modernizacja słoika powinna wystarczyć, ale nasza QA miała pewne problemy z nim, a oni również aktualizowali serwer. Ze względu na brak czasu, nie zbadaliśmy go dalej i po prostu zdecydowaliśmy się zrobić oba.

0
Yoni 6 maj 2020, 14:00

Usuń interfejs API transakcji z aplikacji. JTA 1.2 jest już zawarty na serwerze i nie zawiera wartości w aplikacjach. Zawsze ryzykowne jest, aby przynieść Java EE / SE API w ładowarce z klasy rodzic-ostatniej klasy, chyba że jesteś w 100% pewien, że są to technicznie konieczne, ponieważ mogą prowadzić do problemów takich jak ten.

Nie mogę powiedzieć, jak działało to w poprzednich wersjach serwerów (nastąpiły pewne zmiany na poziomie Java w egzekwowaniu takich kwestii związanych z tym), ale rozwiązanie jest rozsądnie proste.

1
Jarid 24 marzec 2020, 13:03