找不到传递项目依赖项

时间:2013-07-31 09:58:15

标签: java eclipse gradle

我有一个包含4个项目的扁平项目层次结构。让我们称它们为B,C,D,M,它们具有以下线性依赖关系:

B - > C - > M - > d

- > =“取决于”

项目B,C和M有build.gradle和settings.gradle。 settings.gradle始终对所有依赖项目执行includeFlat。如果是B,则包括平面('D','M','C')。 build.gradle定义了始终定义它依赖的项目的依赖关系。如果B是编译项目('C')。

如果我尝试构建项目B,我遇到的问题是在解析B之后,gradle尝试解析C的build.gradle并失败,因为它无法找到M。

* What went wrong:
A problem occurred evaluating project ':C'.
> Project with path 'M' could not be found in project ':C'.

我认为调试输出的相关部分是:

Included projects: [root project 'B', project ':C', project ':D', project ':M']

似乎gradle按字母顺序对include进行排序,不管在其他settings.gradle文件和build.gradle依赖项中定义了什么。

当我创建C时,我也想知道为什么我需要将D包含在includeFlat设置中。但它有效,因为它将包含命令为D,M。

我目前看到的唯一“解决方案”是我删除B中的项目依赖项并依赖于C的构建jar。但是这有一个巨大的(破坏游戏)缺点,当我在DI中更改某些东西时需要一个完整的构建,发布和“从nexus刷新”循环直到变化可见。因为C,M和D仍在积极开发中,所以这不是一种选择。

要解决这个问题,我需要告诉eclipse插件,当它发现一个jar依赖项时,它也是一个项目,它将项目依赖项添加到类路径而不是jar依赖项。

2 个答案:

答案 0 :(得分:2)

您似乎对Gradle多项目构建的工作方式存在一些误解。以下是一些可以帮助您了解正在发生的事情的事实:

  • Gradle构建只能有一个settings.gradle
  • includesettings.gradle语句的顺序无关紧要。
  • 执行依赖关系始终在任务之间,而不是在项目之间。例如,取决于project(":M")取决于该项目的default配置,取决于default。 Gradle将其转换为对M中负责构建其":M"配置工件的那些任务的依赖。请注意,根据项目,意味着该项目中的所有任务都将在依赖项目中的任何任务之前运行。
  • 多项目构建具有逻辑项目层次结构。 :绝对项目路径("M"表示根项目),而{{1}}是相对项目路径。相对路径被解释为相对于当前项目。

为了更深入地了解多项目构建,我建议研究Gradle User Guide中的“多项目构建”一章,以及完整Gradle分布中的多项目构建样本。

答案 1 :(得分:0)

整个混乱是由于缺少':'造成的。 Gradle似乎在区分 compile project('M')compile project(':M'),当项目(在这种情况下,行在C中)包含在另一个项目中时。只需构建C与两个版本都可以正常工作。 在这两种情况下,gradle projects都会为项目C返回相同的树。

我无法解释究竟是什么区别,我希望有人可以向我解释。