如何禁止访问依赖项的依赖项

3

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

A -> B -> C

A依赖于B,B依赖于C,而且A、B、C是单独的Maven模块。

是否有可能让B掩盖对C的依赖关系,这样A就不能直接调用C的公共函数或实例化C的对象了?

1个回答

3
您可以将B对C的依赖标记为<optional>true</optional>。这将阻止Maven传递解析此依赖项,因此A不会传递依赖于C。这意味着在构建A时,除非A定义了对C的显式依赖关系,否则它根本不会在其类路径中具有C。
当然,如果A定义了对C的显式依赖关系,Maven将添加它。 Maven是一个构建工具,而不是可以防止A从明确访问C的安全框架。
另外,<scope>provided<scope>具有不同的含义,但在处理传递依赖关系方面类似。

不客气。但是,请务必阅读有关此功能的文档。使用此功能可能意味着您没有正确地构建项目。也许更“Maveny”的方法是将B分为两个部分:需要C的部分(B1)和不需要C的部分(B2)。然后,A和B1都依赖于B2。 - Anton Koscejev
我刚刚注意到,如果A获取了一个在B中定义的接口的对象,而该对象实际上是在B中构造的C类的实例(也在B中),那么就会出现ClassNotFoundException异常。 - FelixZett
实际上,如果A想要使用C中的类,则需要将C添加到类路径中。根据您正在使用的环境类型,我无法提供非常精确的建议。 根据您的目标,也许以下结构适合您:B-api(上面的B2),B-impl(依赖于C的B1),A-library(需要B,由对B-api的依赖表示),D-application(依赖于A-library和B-impl以获取库)。然后,您可以将D作为最终应用程序进行构建,它将在类路径上拥有所有内容。但是,在开发A时,它将使用api而不是impl。 - Anton Koscejev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接