【问题标题】:How to prohibit access to dependencies of a dependency如何禁止访问依赖项的依赖项
【发布时间】:2016-11-01 03:27:28
【问题描述】:

我目前正在试验 maven 模块结构。 目前我有以下结构:

A -> B -> C

其中 A 依赖于 B,B 依赖于 C,A、B、C 是独立的 maven 模块。

B 是否有可能以某种方式掩盖其对 C 的依赖,以使 A 不能直接调用公共函数或从 C 实例化对象?

【问题讨论】:

    标签: java maven module dependencies


    【解决方案1】:

    您可以将 B 对 C 的依赖标记为<optional>true</optional>。这将阻止 Maven 传递地解决这种依赖关系,因此 A 不会传递地依赖于 C。这意味着当构建 A 时,它的类路径中根本不会有 C,除非 A 定义了对 C 的显式依赖。

    当然,如果 A 定义了对 C 的显式依赖,Maven 会添加它。 Maven 是一个构建工具,而不是一个可以阻止 A 显式访问 C 的安全框架。

    另外,<scope>provided<scope> 有不同的含义,但在传递依赖方面的作用类似。

    【讨论】:

    • 不客气。但是,请务必阅读有关此功能的文档。使用它可能意味着您没有正确构建项目。也许更“Maveny”的方法是将B分成两部分:需要C的部分(B1)和不需要的部分(B2)。 A 和 B1 将都依赖于 B2。
    • 我刚刚注意到,如果 A 获得了一个接口的对象(在 B 中),它实际上是在工厂(也在 B 中)构造的 C 中的类的实例,则会出现 ClassNotFoundException
    • 确实,如果 A 想使用 C 中的类,它需要在类路径中有 C。对于您正在使用的环境类型,我不能非常精确。根据您要完成的工作,也许以下结构对您有用:B-api(上面的 B2)、B-impl(B1 依赖于 C)、A-library(需要 B,以依赖于B-api),D-应用程序(取决于库的 A-library 和 B-impl)。然后将 D 构建为最终应用程序,它将在类路径中包含所有内容。但是在开发A时,它会使用api,而不是impl。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 2021-09-29
    • 1970-01-01
    • 2014-03-18
    相关资源
    最近更新 更多