Подтвердить что ты не робот

Почему Spring 3 требует явного объявления зависимости cglib при использовании Maven?

Я использую Spring 3 и Maven. Я определил все модули Spring в моем pom.xml.

Когда я использую <aop:scoped-proxy />, я получаю сообщение об ошибке CGLIB.

Ну... Я добавляю CGLIB в качестве зависимости в моем пом и все работает...

Я немного смущен... Maven - менеджер зависимостей... Почему он не загружает CGLIB, когда я использую модуль spring -aop?

Это не единственный случай... Почему некоторые проекты нуждаются в явном декларации зависимости вместо использования механизма транзитивной зависимости Maven?

4b9b3361

Ответ 1

Это потому, что cglib помечен как дополнительная зависимость.

По существу вам не нужен cglib для каждого использования библиотеки spring -aop, поэтому maven не загружает ее автоматически. Вы должны указать его вручную, к сожалению.

Ответ 2

Я немного смущен... Maven - менеджер зависимостей... Почему он не загружает cglib, когда я использую модуль spring -aop?

Поскольку не все используют CGLIB (прокси AOP в Spring может быть динамическим прокси JDK или прокси CGLIB), то CGLIB помечен как optional в pom spring-aop, и вы должны добавить его явно, если хотите его использовать. Это именно то, для чего нужны дополнительные зависимости.

Другим подобным примером является Hibernate, который позволяет выбирать между cglib и javassist в hibernate-core таким же образом. Hibernate также позволяет выбирать между различными пулами подключений (если вы решили использовать один из них) или поставщиками кешей (только ehcache, по умолчанию, не объявлено как необязательное).

Ответ 3

Я предполагаю, что cglib не включен в Spring по умолчанию. И поэтому он не включен в pom, если вы явно не включили его.

Насколько я знаю, Maven не может войти в ваши конфигурационные файлы Spring и определить, нужны ли ему дополнительные, по выбору, библиотеки. Хотя, это, конечно, похоже, что это будет классный плагин Spring -Maven, если бы можно было модифицировать pom на лету через плагин. Не уверен, что это так, но было бы круто.

Ответ 4

Хорошая новость - это проблема прошлого:

Как и в случае с Spring 3.2, больше не нужно добавлять CGLIB в ваш путь к классу проекта, поскольку классы CGLIB переупаковываются в соответствии с org.springframework и включен непосредственно в spring -core JAR. Эта означает, что поддержка прокси-сервера на основе CGLIB работает так же, как Динамические прокси-серверы JDK всегда имеют.

Подробнее здесь.