在Maven中将传递依赖性限制为运行时范围

Jua*_*nal 15 maven-3 maven

我有两个使用Maven的项目.第一个是包含实用程序类和方法的库.第二个项目是一个将库作为依赖项的实际应用程序.我的库在内部使用第三方库.

所以这些是依赖:

  • 我的图书馆:取决于第三方图书馆
  • 我的申请:取决于我的图书馆

但是,我不希望第三方库类在我的应用程序的编译时可用.这是因为应用程序由大型团队支持,并且我希望防止人们在应用程序中意外使用第三方库中的方法,因为某些类名称和某些方法名称在两者之间是相似的.当然,第三方库必须在运行时在我的应用程序中可用.

如果所有依赖项的范围都是编译的,那么它就无法实现我的目标.有没有办法在Maven 3中实现这一目标?

Mic*_*ski 18

非常好的问题,遗憾的是,由于其基本设计,您无法使用Maven 3,或2或任何其他版本执行此操作.您所询问的实际上是一种理想的行为,因为事实上任何工件的compile依赖性都应该与runtime范围一致.但是,这样的设计会导致一些问题.正如您可以阅读Maven关于compile范围的依赖机制简介:

打算[编译依赖项的传递依赖性本身就是编译依赖项应该被视为]运行时作用域,以便必须明确列出所有编译依赖项 - 但是,有一种情况是您依赖的库扩展了一个类另一个库,强制您在编译时可用.因此,编译时依赖性仍然是编译范围,即使它们是可传递的.

因此,正如您所看到的,您需要的实际上是这种行为的正确设计,遗憾的是无法实现.


Ret*_*mür 5

在过去三年中,没有任何变化,因此Michal的答案仍然是正确的:在Maven中没有任何方法可以限制传递可见性。

但是,您应该考虑重新设计库,以将其拆分为一个api工件,该api工件是编译时依赖项,它本身不依赖于第三方库,而一个实现工件仅需要依赖于运行时,并且依赖于第三方图书馆。