我正在编写一个具有以下依赖关系的库:
```
<dependency>
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-servlets</artifactId>
<version>[3.1.0,)</version>
</dependency>
<dependency>
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-core</artifactId>
<version>[3.1.0,)</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>9.3.2</version>
<scope>provided</scope>
</dependency>
```
现在的问题是 - 这个库的一些用户也将它与dropwizard-core
一起使用,在这种情况下,我的库为dropwizard框架提供了一些额外的功能,因此dropwizard-core
是一个可选的依赖项。
问题是 - 当用户导入dropwizard-core
时 - 它会自动包含我在上面指定的其他依赖项(例如metrics-core
),在这种情况下 - 通过dropwizard-core
导入的版本可能会与版本明确指定。我该如何解决这个问题?
此库的一组用户将使用它 - 没有dropwizard-core
,因此我不希望这些用户导入dropwizard-core
(因此原子依赖性)。
答案 0 :(得分:0)
您有两种选择。您应该根据使用模式选择一个。例如,大部分时间排除或包含的额外依赖性是什么?
<强> 1。明确排除(默认情况下包括)
保持原样,然后要求用户在必要时排除额外内容:
<dependency>
<groupId>some.group.id</groupId>
<artifactId>something-important</artifactId>
<exclusions>
<exclusion>
<groupId>some.group.id</groupId>
<artifactId>something-extra</artifactId>
</exclusion>
</exclusions>
</dependency>
<强> 2。默认情况下排除(明确包含)
修改你的pom.xml:
<dependency>
<groupId>some.group.id</groupId>
<artifactId>something-extra</artifactId>
<optional>true</optional>
</dependency>
OR
<dependency>
<groupId>some.group.id</groupId>
<artifactId>something-extra</artifactId>
<scope>provided</scope>
</dependency>
使用可选项,如果暗示您的库可以在没有它的情况下正常工作,只是某些部分可能无法正常工作。当暗示您的图书馆需要它时提供使用,但是由用户决定从哪里获取它(或者哪个实现)。
请参阅两者的文档: https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html