确定传递依赖的来源

时间:2013-07-15 15:08:31

标签: gradle

我有一个项目,我正在使用sl4j和log4j。我最近为我的项目添加了一些新的依赖项,我添加的其中一个新依赖项包括对logback-classic的传递依赖,其中包括sj4j的另一个绑定。

我想摆脱logback,但我不知道哪些直接依赖项添加了传递依赖项,以便我可以将其排除。

在maven中,我知道如何获取整个依赖关系图以确定哪个是传递依赖的来源,但我不清楚如何使用gradle执行此操作。

有没有人知道如何使用gradle获取传递依赖的源依赖?

2 个答案:

答案 0 :(得分:48)

要显示每个类路径的整个依赖关系树,请使用gradle dependencies。如果您只对特定的类路径感兴趣,请使用(例如)gradle dependencies --configuration compile。使用-p选项在子项目上运行。

要显示谁将特定依赖关系引入特定类路径,以及如何解决任何版本冲突,请使用(例如)gradle dependencyInsight --dependency logback --configuration compile

请注意,您还可以从整个类路径(或多个)中排除依赖项。通常这比排除特定的传递依赖更可靠。例如:

configurations.all*.exclude module: "logback-classic"

答案 1 :(得分:0)

更新的答案:

我用这段代码解决了 logback 和 log4j 之间的依赖问题:

queue q = [ from ]

visited = set<node>
back = map<node, list<node>>

while q.not_empty():
  now = q.front()
  if (now == target):
    continue
  foreach adjacent_node to now in the graph:
    if (adjacent_node in visited):
      back[adjacent_node].push(now)
    else:
      visited.add(adjacent_node)
      back[adjacent_node] = [ now ]
      q.push(adjacent_node)

# Now collect all shortest paths

ret = []
current = []

def collect(x):
  current.push(x)
  if (x == from):
    ret.push(current.reversed())
    return
  foreach v in back[x]:
    collect(v)
  current.pop()

这个解决方案找到了对 log4j-slf4j-impl 的任何依赖,并指示它从 logback 中选择一个(这是一个 spring 应用程序)。这个解决方案出奇地难以追踪,但在许多情况下可能非常有用。

这是关于 handling conflicting candidates 的 gradle 文档。