2016-06-10 84 views
0

我写一个库,具有以下依存关系:从另一个依赖指定的依赖性明确Maven的

```

<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

谁导入的用户(我假设你的意思是使用的依赖关系)可以覆盖你的决定。此外,我建议你永远不要使用版本范围....如果你有可选的依赖关系,而不是将它们定义为可选... – khmarbaise

+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

+0

对于你的情况,我会建议使用' true'。 –

+0

现在,我已经选择使用可选的'something-extra'依赖项。唯一的解决方法是 - 我必须找出与'something-extra'版本兼容的'jetty-servlet'等的确切版本。 –