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。我的依赖项是否正确?不幸的是,我发现官方文档有点太抽象了,无法理解这个问题。
您是否检查过此文档。它很好地描述了您的用例。将依赖项标记为可选不会在使用库的应用程序中将它们解析为传递依赖项(即使范围compile
(。
与用于运行时环境提供的所需依赖项的<scope>provided</scope>
不同,<optional>true</optional>
依赖项不一定是必需的(这个想法是某些依赖项仅用于项目中的某些功能,如果不使用该功能,则不需要。
如果使用库的项目将使用可选依赖项提供的任何功能,则项目必须声明自己的依赖项。
由于您的配置对我来说似乎是正确的,因此我不知道发生问题的原因。也许您的可选依赖项由您意想不到的版本的其他库解析。这当然可能会导致问题。