Maven中"提供"范围的"可选"依赖项

Luk*_*der 30 log4j dependency-management maven

Maven有时候有点过头了......我创建了一个库,它对slf4j和log4j有可选的依赖.通过可选,我的意思是:

  • 我的库在编译时需要那些日志框架
  • 我的库在运行时不需要它们,但如果它"发现"它们,它将使用它们

目前,我已将该依赖标记为"可选"和"已提供":

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.16</version>
    <type>jar</type>
    <scope>provided</scope>
    <optional>true</optional>
</dependency>
Run Code Online (Sandbox Code Playgroud)

但是我的一些用户报告了问题,因为他们不需要log4/slf4j.我的依赖是否正确?不幸的是,我发现官方文档有点过于抽象,无法理解这个问题.

FrV*_*aBe 34

你看过这个文件了吗?它描述了你的用例非常好.将依赖项标记为可选不会将它们解析为使用您的库的应用程序中的传递依赖项(即使范围是compile).

<scope>provided</scope>与运行时环境提供的必需依赖关系不同,<optional>true</optional>依赖关系不一定是必需的(想法是某些依赖关系仅用于项目中的某些功能,并且不需要如果没有使用该功能.)

如果使用您的库的项目将使用由可选依赖项提供的任何功能,项目必须为它们自己声明这些依赖项.

由于您的配置对我来说似乎是正确的,我不知道出现什么问题.也许你的可选依赖项会被你不期望的版本中的其他库解析.那当然可能会引起问题.