【问题标题】:Why Spring 3 needs explicit cglib dependency declaration when using Maven?为什么 Spring 3 在使用 Maven 时需要显式的 cglib 依赖声明?
【发布时间】:2011-01-16 05:34:09
【问题描述】:

我正在使用 Spring 3 和 Maven。我已经在 pom.xml 中定义了所有 spring 模块。

当我使用 <aop:scoped-proxy /> 时,我收到一条错误消息,指出缺少 CGLIB。

嗯...我在我的 pom 中添加了 CGLIB 作为依赖项,它全部运行...

我有点迷茫……Maven是一个依赖管理器……为什么我使用spring-aop模块时它不下载CGLIB?

这不是唯一的情况......为什么有些项目需要显式依赖声明而不是使用Maven传递依赖机制?

【问题讨论】:

  • @Jerome C. 好吧,你不能指望 maven 自己找到所有东西,这不是一件神奇的事情,因为有时存储库中不存在某些依赖项,有时你需要手动下载它们.但是它应该自己下载该依赖项,但它没有,而且 Maven 远非完美,但它是所有其他构建工具中最接近的(尽管 maven 不仅仅是一个构建工具)。
  • @Pascal Thivent 嗯,我认为你错过了我的评论,或者我以无法理解的方式写了它,因为:1. Maven 将找到一个依赖关系,如果它在存储库中可用并且如果 pom 包含所需的信息-“..,因为有时存储库中不存在某些依赖项” 2. 但是在 spring 和 cglib 的情况下,cglib 是一个可选依赖项,因此除非您明确指定它,否则您将无法获得它-“好吧,您可以不要指望 maven 自己找到所有东西,这不是一件神奇的事情”-> 正如你所说,因为它是一个可选的依赖项,它不会找到它。我哪里错了
  • @Pascal Thivent 不管怎样,几周前我刚开始使用 maven,它是非常好的工具/平台,但每个人都知道你是经验丰富的用户,他们应该使用常识并得出结论认为你的帖子/cmets 可能比我的更正确。我个人喜欢阅读你关于 Maven 的帖子/cmets,因为它们总是有用的,所以不要以错误的方式理解这一点。干杯
  • @c0mrade 也许我误解了你的评论。在那种情况下,我道歉。我会删除我的
  • @Pascal Thivent 不用担心 m8,留下您的评论,因为它可能对某人有帮助。

标签: spring maven-2 dependencies maven


【解决方案1】:

这是因为 cglib 被标记为optional dependency

基本上你不需要每次使用 spring-aop 库时都需要 cglib,所以 maven 不会自动下载它。不幸的是,您需要手动指定它。

【讨论】:

  • 确切地说,我只是发现了可选功能;)但是当一个依赖项被声明为可选时,它只是用于 doc 吗?或者有办法在模块声明中激活它?
  • @Jerome 据我了解,在构建 spring-aop 时会下载依赖项,但在构建依赖于 spring-aop 的项目时不会下载。如果这是有道理的!
  • CGLIB 用于制作 CGLIB-PROXY 来管理不实现接口的注入(使用 AOP)bean
【解决方案2】:

我有点迷茫……Maven是一个依赖管理器……为什么我使用spring-aop模块时它不下载cglib?

因为不是每个人都使用 CGLIB(Spring 中的 AOP 代理可以是 JDK 动态代理或 CGLIB 代理)所以 CGLIB 在 spring-aop 的 pom 中被标记为 optional 依赖项,如果您必须显式添加它你想用它。这正是可选依赖项的用途。

另一个类似的例子是 Hibernate,它允许您以相同的方式在 hibernate-core 中选择 cglib 和 javassist。 Hibernate 还允许您choose 在各种连接池(如果您决定使用其中之一)或缓存提供程序(只有 ehcache,默认值,未声明为可选)之间。

【讨论】:

    【解决方案3】:

    我的猜测是cglib is not enabled in Spring by default。因此,除非您明确启用它,否则它不会包含在 pom 中。

    据我所知,Maven 无法进入您的 Spring 配置文件并确定它是否需要其他可选启用的库。虽然,如果可以通过插件动态修改 pom,这听起来肯定是一个很酷的 Spring-Maven 插件。不知道是不是这样,但会很酷。

    【讨论】:

      【解决方案4】:

      好消息 - 这是过去的问题

      从 Spring 3.2 开始,不再需要将 CGLIB 添加到您的 项目类路径,因为 CGLIB 类被重新打包在 org.springframework 并直接包含在 spring-core JAR 中。这 意味着基于 CGLIB 的代理支持的工作方式与 JDK 动态代理总是有。

      阅读更多here

      【讨论】:

        猜你喜欢
        • 2021-08-22
        • 2019-02-15
        • 2013-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-13
        • 2011-06-28
        相关资源
        最近更新 更多