Gradle对另一个项目模块的依赖性失败

时间:2017-02-13 16:02:39

标签: gradle build dependencies

我发现网上有很多关于Gradle设置的帖子。话虽这么说,我已经进行了大量研究,但没有找到我正在寻找的内容,或者我使用了不正确的术语。我使用的是Gradle版本3.3。

所以我有多个Gradle项目,每个项目都是单独维护的。没有掌握Gradle项目。每个项目都有自己的模块,构建和设置文件。结构如下:

Projects
  A
    a1
      build.gradle
    a2
      build.gradle
    build.gradle
    settings.gradle
  B
    b1
      build.gradle
    b2
      build.gradle
    build.gradle
    settings.gradle

我尝试做的是让B依赖于A的模块。让我们假设B中的一个模块依赖于a1。在B的设置中,我完成了以下操作:

rootProject.name = 'B'
rootProject.setProjectDir(new File(".")

include 'a1'
project(':a1').setProjectDir(new File(settingsDir.getParentFile(), "/A/a1"))

我存储版本号的方式是通过ext闭包中的每个项目的build.gradle文件。然后我通过项目访问它们。以下是B&#39的构建文件的外观:

ext {
  freemarkerVersion = '2.3.19'
}

dependencies {
  compile project(':a1')
  compile group: 'org.freemarker', name: 'freemarker', version: rootProject.properties.get('freemarkerVersion')
}

我所看到的是B能够解析其依赖关系,并且正在尝试编译项目a1,但它使用的是B&B的版本号而不是A' s。我通过在具有不同版本号的两个项目中放置共同依赖项来验证这一点。依赖性出现在使用B&#39的版本。我还更改了B中的版本号并进一步证实了这一点。因此,如果我可以在他们自己的build.gradle文件中使用适合项目的版本获得任何帮助,那就太棒了!

编辑:更新了帖子,发现以前的问题来自相对路径无法解决。

1 个答案:

答案 0 :(得分:1)

不要嘟嘟我自己的号角或任何东西,但是我发布了我想出的解决方案,因为我没有其他的答案敲我的门。

我做的第一件事就是将我的所有版本属性移动到外部gradle.properties文件,而不是在项目的build.gradle文件中的ext闭包中。执行此操作时,项目将在从其自己的上下文编译时默认加载属性文件。它当然会从user.home gradle.properties文件中被覆盖,所以请记住这一点。示例gradle.properties:

a_freemarkerVersion = 2.3.19

当使用另一个项目中的一个项目模块时,您需要一种方法来单独链接这两个模块,以便Gradle可以解析依赖项的属性。我通过定义一个加载所需项目属性文件的方法来实现这一点。这种方法如下:

def addConfig(String parent, String filename) {
    Properties props = new Properties()
    props.load(new FileInputStream(new File(project.projectDir.getParent(), "/${parent}/${filename}")))
    props.each { prop ->
        project.ext.set(prop.key, prop.value)
    }
}

addConfig("A", "gradle.properties")

所有这些方法都会上升到一个目录,进入指定的项目,并检索其gradle.properties文件并将这些变量加载到当前项目的属性中。话虽如此,这里有一点需要注意:如果你在两者中定义相同的变量,其中一个将被覆盖。为了避免这种情况,我只使用项目名称和下划线为所有变量添加前缀。这将保证他们永远不会相互冲突。

我使用以下语法访问了所有项目中的变量:

dependencies {
    compile group: 'org.freemarker', name: 'freemarker', version: "${a_freemarkerVersion}"
}

其余设置与我在初始帖子中定义的相同。只需确保包含依赖模块,指定其项目目录,并从项目的依赖项中编译该项目。