2010-02-12 7 views
26

Używam Spring 3 and Maven. Zdefiniowałem wszystkie moduły sprężyn w moim pliku pom.xml.Dlaczego Spring 3 wymaga jawnej deklaracji zależności cglib podczas korzystania z Maven?

Kiedy używam <aop:scoped-proxy />, pojawia się błąd informujący, że brakuje CGLIB.

Cóż ... dodam CGLIB jako zależność w moim pom i to wszystko działa ...

jestem trochę zdezorientowany ... Maven jest menedżerem zależność ... Dlaczego nie pobrać CGLIB, kiedy używam modułu spring-aop?

To nie jedyny przypadek ... Dlaczego niektóre projekty wymagają jawnej deklaracji zależności zamiast korzystania z mechanizmu przechodniego Maven?

+0

@Jerome C. Cóż, nie można oczekiwać, że maven znajdzie wszystko samodzielnie, nie jest to magiczne, ponieważ czasami niektóre zależności nie istnieją w repozytorium, czasami trzeba je pobrać ręcznie.Jednak powinien sam pobrać tę zależność, ale tak się nie stało, a Maven jest daleki od doskonałości, ale jest najbliższy wszystkim innym narzędziom do budowania (chociaż maven nie jest tylko narzędziem do budowania). – ant

+0

@Pascal Thivent hmm Myślę, że tęsknisz-rozumiesz mój komentarz lub napisałem go w niepojęty sposób, ponieważ: 1. Maven znajdzie zależność, jeśli jest dostępna w repozytorium i jeśli pom zawiera wymagane informacje - ".. , ponieważ czasami niektóre zależności nie istnieją w repozytorium " 2. Ale w przypadku wiosny i cglib, cglib jest zależnością opcjonalną, więc nie dostaniesz go, chyba że wyraźnie to określisz -" Cóż, nie możesz się spodziewać maven znaleźć wszystko na własną rękę, nie jest to magiczne "-> jak powiedziałeś, ponieważ jest to opcjonalna zależność, której nie znajdzie. Gdzie się myliłem – ant

+0

@Pascal Thivent Tak czy inaczej Właśnie zacząłem z maven kilka tygodni temu jego bardzo dobrym narzędziem/platformą, ale każdy wie, że jesteś bardzo doświadczonym użytkownikiem i powinni używać zdrowego rozsądku i stwierdzić, że twój post/komentarze prawdopodobnie będą bardziej poprawne niż moje. Osobiście lubię czytać twoje posty/komentarze na temat Mavena, ponieważ są one zawsze przydatne, więc nie zrozumcie tego w niewłaściwy sposób. Pozdrawiam – ant

Odpowiedz

50

To dlatego, że cglib jest oznaczony jako optional dependency.

Zasadniczo nie potrzebujesz cglib do każdego użycia biblioteki spring-aop, więc maven nie pobiera go automatycznie. Musisz określić to ręcznie, niestety.

+0

+1 dla twojej odpowiedzi – ant

+0

dokładnie, właśnie odkrywam opcjonalną funkcję;) Ale kiedy zależność jest zadeklarowana jako opcjonalna, to tylko dla doc? lub jest sposób, aby aktywować go w deklaracji modułu? –

+1

@Jerome, jak rozumiem, zależność jest pobierana, gdy budują spring-aop, ale nie wtedy, gdy budujesz projekt, który zależy od spring-aop. Jeśli to ma sens! –

5

Domyślam się, że to cglib is not enabled in Spring by default. I dlatego nie jest zawarty w pom, chyba że wyraźnie go włączysz.

O ile mi wiadomo, Maven nie może wejść do plików konfiguracyjnych Spring i określić, czy potrzebuje dodatkowych opcjonalnie włączonych bibliotek. Chociaż z pewnością brzmi to jak fajna wtyczka Spring-Maven, gdyby można było zmodyfikować pom w locie za pomocą wtyczki. Nie jestem pewien, czy to prawda, ale byłoby fajnie.

17

Jestem trochę zdezorientowany ... Maven jest menedżerem zależności ... Dlaczego nie pobiera cglib kiedy używam modułu spring-aop?

Ponieważ nie wszyscy używają CGLIB (an proxy AOP wiosną może być JDK dynamicznego proxy lub serwer proxy CGLIB) tak CGLIB jest oznaczony jako zależność w pom z spring-aopoptional i trzeba je dodać wyraźnie, jeśli chcesz z niego skorzystać. Właśnie do tego służą opcjonalne zależności.

Innym podobnym przykładem jest Hibernate, który pozwala wybrać między cglib i javassist w hibernate-core w ten sam sposób. Hibernate umożliwia także choose między różnymi pulami połączeń (jeśli zdecydujesz się użyć jednego z nich) lub dostawcami pamięci podręcznej (tylko ehcache, domyślnie, nie jest deklarowane jako opcjonalne).

2

Good news - jest to problem z przeszłości:

od wiosny 3.2, nie jest już konieczne, aby dodać CGLIB do projektu ścieżki klasy, jako zajęcia CGLIB są pakowane pod org .springframework i zawarte bezpośrednio w JAR-splot sprężynowy. Ta oznacza, że ​​obsługa proxy opartego na CGLIB działa w taki sam sposób, jak zawsze mają dynamiczne proxy JDK .

Czytaj więcej here.

+0

tak dobrze, dzięki wskazaniu go;) –