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

时间:2011-05-02 17:39:42

标签: maven log4j dependency-management

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>

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

1 个答案:

答案 0 :(得分:34)

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

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

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

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