Java 具有相对配置的多级渐变项目

Java 具有相对配置的多级渐变项目,java,android,gradle,build.gradle,Java,Android,Gradle,Build.gradle,是否可以在gradle中设置一个项目树,以便每个子树独立构建 在示例目录(项目)结构中: A + B1 + C1 + C2 + B2 + C4 + C5 您应该能够自己构建B1(将构建C1和C2)以及A(将构建所有7个项目) 问题1:A忽略B1配置 A/B1/setting.gradle: include "C1", "C2" 在A中,执行“gradle projects”命令将显示B1,而不是C1或C2 问题2:相对依赖性 如果C1依赖于C2,则指定此项

是否可以在gradle中设置一个项目树,以便每个子树独立构建

在示例目录(项目)结构中:

A
+  B1
   +  C1
   +  C2
+  B2
   +  C4
   +  C5
您应该能够自己构建B1(将构建C1和C2)以及A(将构建所有7个项目)

问题1:A忽略B1配置

A/B1/setting.gradle:

include "C1", "C2"
在A中,执行“gradle projects”命令将显示B1,而不是C1或C2

问题2:相对依赖性

如果C1依赖于C2,则指定此项的唯一方法是绝对路径。这意味着它将适用于A或B1,但不适用于两者:

project(':B1:C2') // works for B1 but not for A
or
project(':A:B1:C2') // works for A but not for B1

这个目录结构是否可能,我可以在其中分别构建A、B1和B2?

AFAIK根项目中只能有一个settings.gradle,并且没有将层次结构项目分组为子组的方法

您的设置中可以有多个级别。但是:

include "b1",
        "b1:c1",
        "b1:c2",
        "b2",
        "b2:c4",
        "b2:c5"
如果您在根目录中执行gradle,它将构建所有项目,但如果您在b1中执行它,它不会只构建b1、c1和c2

我不确定您想在这里完成什么,但任务依赖关系可能会修复您的目标:

b1/build.gradle:

tasks.jar.dependsOn += [
    project(":b1:c1").tasks.jar,
    project(":b1:c2").tasks.jar
]
运行jar任务:

$ gradle -p b1 jar
:b1:compileJava UP-TO-DATE
:b1:processResources UP-TO-DATE
:b1:classes UP-TO-DATE
:b1:c1:compileJava UP-TO-DATE
:b1:c1:processResources UP-TO-DATE
:b1:c1:classes UP-TO-DATE
:b1:c1:jar
:b1:c2:compileJava UP-TO-DATE
:b1:c2:processResources UP-TO-DATE
:b1:c2:classes UP-TO-DATE
:b1:c2:jar
:b1:jar

BUILD SUCCESSFUL

Total time: 0.761 secs

你使用的是像Android Studio这样的IDE吗?我使用的是eclipse。这里一切都很简单,所有的源代码树都包含在内,所有的东西都编译好了。谢谢。这将在很大程度上解决问题1,但问题2仍然存在(如何指定子项目之间的构建依赖关系)。我们有许多独立的模块,我们使用源代码控制(无工件repo)导入这些模块,因此我们需要以不同的组合构建它们。如果你认为项目A是一个应用程序,那么还有其他几个应用程序,每个应用程序都需要不同的子项目组合。看起来唯一的解决方案是保持所有子项目的平面目录结构,因此它们总是作为兄弟项目彼此相对。如果像我上面所做的那样,您可以依赖其他深层层次结构中的其他项目-但它要求您有一个带有settings.gradle的根项目。b2/c4/build.gradle:
依赖项{compile project(“:b1:c1”)}
。应该工作另一件你可能想看的事情是建立你自己的工件工厂或Nexus并在那里发布工件,这样你就可以像其他Maven/Ivy工件一样依赖它们了。谢谢。C1能表达对C2的依赖吗?它应该以一种在顶部有或没有的方式进行。我发布的所有内容都依赖于存在,因为它包含settings.gradle,其中包括所有子项目。只要A是根项目,就没有关于哪个项目可以依赖于哪个其他项目的限制。我怀疑您正在尝试进行一个设置,其中包括来自外部存储库的B1和B2。在这种情况下,我认为您无法做到这一点,因为层次结构将不同(即:如果B1是根,则为c1;如果A是根,则为B1:c1)。也许相对路径是可行的,但我真的不知道Gradle是否支持这一点。