2015-10-08 14 views
7

Jestem całkowicie zdezorientowany, jeśli chodzi o ładowanie klas w tomcat. Więc proszę o zachowanie mnie, jeśli moje pytanie brzmi głupio.Wiosenne słoiki w katalogu tomcat lib

Wdrażamy wiele webappów sprężynowych na pojedynczym serwerze tomcat. Aby zmniejszyć ślad pamięci, pomyśleliśmy o posiadaniu słoików sterownika wiosny, hibernacji i bazy danych w katalogu tomcat lib, aby były one wspólne dla wszystkich aplikacji internetowych.

Zacząłem od oznaczenia sprężyn jako provided i skopiowałem je do tomcat lib. Ale na starcie serwera zacząłem dostawać wiele ClassNotFoundErrors, jak dla commons-logging, commons-fileupload, jackson, więc musiałem przenieść te słoiki również do tomcat lib.

Ale to zaczęło być nudne. Co się stanie, jeśli w przyszłości dodaję do mojego projektu kolejną zależność wiosenną, powiedzmy dane źródłowe-Kasandra. Czy muszę też przenieść słoiki zależne od siebie? To może być niekończące się. Mogę też uzyskać błędy CNF w czasie wykonywania.

Próbowałem podążać za linkiem this i przywróciłem kontekst wiosenny i wiosenny do wojny aplikacji. Ale to nie zadziałało, uzyskało ClassNotFound na jakiejś klasie podczas inicjowania. Próbowałem zrozumieć kolejność classes getting loaded in tomcat, ale niewiele mogłem zrozumieć.

Potem znalazłem kompletne inne wytłumaczenie dla JDBC driver loading, które w pewnym sensie przeczy wszystkim innym wyjaśnieniom i całkowicie mnie pomieszało.



Jak czytam więcej, myślę, że nie jest to najlepsze rozwiązanie, aby przenieść słoików wiosny do tomcat lib, ale nadal nie mam dobrego uzasadnienia. A dlaczego działa sterownik JDBC? Czy ktoś może mi wyjaśnić? Czy program ładujący klasy dla każdej aplikacji webapp tworzy kopię każdej klasy?

Edytuj 1: Dowiedziałem się, że kilka zależności to optional w słojach wiosną i będą wymagane, jeśli są używane w mojej aplikacji internetowej. Tak więc sieć wiosenna zależy od bibliotek jackson, ale jest opcjonalna dla mojej aplikacji. Muszę się dowiedzieć, które słoiki są wymagane do mojego projektu, a które są również wymagane wiosną, te słoiki muszą zostać przeniesione do tomcat lib.

Odpowiedz

1

Spróbuję wyjaśnić to, co wiem.

Podczas wdrażania wojny na swoim kocurem, załadunek klasa stanie się w ten sposób:

  1. wygląd klasa załadować w WAR classloader
  2. jeśli nie znaleziono przejście do rodzica (tomcat/lib folder)

Co się stanie w twoim przypadku, to, że wiosna ma wiele zależności, jeśli zapakujesz ją na wojnę, jej zależności również zostałyby zapakowane i wszystko byłoby w porządku. Ale ponieważ zdefiniowałeś sprężynę tak jak podano, wszystkie jej zależności są również uważane za dostarczone, a kiedy umieścisz ją w katalogu/lib, sprężyna jest dostępna, ale jej zależności nie są.

Co trzeba zrobić, to umieścić wszystkie zależności sprężynowe i zależności zależności (etc.) w folderze lib. Innym rozwiązaniem jest zdefiniowanie pośredniej WAR w hierarchii ładowania klas, która będzie zawierała wszystkie twoje wspólne biblioteki.

+0

dzięki za dane wejściowe. Wygląda na to, że zależności, które powodowały problem, były "opcjonalne".Trudno jest więc znaleźć zależność przechodnią, której potrzebowałbym. – sidgate

+0

Jeśli użyjesz maven do zbudowania swoich WOJD, pakuje on wszystkie przechodnie w artefakt WAR. –

+0

nie wszystkie, opcjonalne zależności nie są uwzględniane – sidgate

Powiązane problemy