Gradle多项目出现“在项目上找不到属性'sourceSets'”错误

23

我的gradle配置相当不错,可以很好地构建所有内容。但是我多项目构建中的其中一个项目与其他项目区别太大了,我很想将其移动到另一个git存储库并使用子模块进行配置。

首先,我将该项目及其资源移动到子文件夹 Libraries/MovedProject。更改gradle配置文件中的某些行后,它可以正常工作。但是,然后我决定为此项目编写一个新的build.gradle,并将所有配置从主配置文件中移到那里。

这就是一切停止工作的地方。每次我尝试调用任何任务时,它总是以错误信息结束:Could not find property 'sourceSets' on project ':Libraries/MovedProject'。导致这个问题的代码行是:

dependencies {
    ...
    if (noEclipseTask) {
        testCompile project(':Libraries/MovedLibrary').sourceSets.test.output
    }
}

我用它来运行测试,其中使用其他项目中的类。如果我删除那一行,只有在到达使用MovedProject的项目的compileTestJava任务时才会构建失败。如果我删除那行并调用gradle:Libraries/MovedLibrary:properties,我可以看到:

...
sourceCompatibility: 1.7
sourceSets: [source set main, source set test]
standardOutputCapture: org.gradle.logging.internal.DefaultLoggingManager@1e263938
...  

gradle :Libraries/MovedLibrary:build 构建成功时。

目前我已经按照以下方式设置好了一切:

  1. 目录:

    • /SomeMainProject1
    • /SomeMainProject2
    • /SomeMainProject3
    • /Libraries
      • /MovedProject
        • build.gradle
        • dependencies.gradle
        • project.gradle
        • tasks.gradle
    • /Builder
      • dependencies.gradle
      • project.gradle
      • tasks.gradle
    • build.gradle
    • settings.gradle
  2. settings.gradle

include Libraries/MovedProject,
        SomeMainProject1,
        SomeMainProject2,
        SomeMainProject3
  • 移动项目的sourceSets在Libraries/MovedProject/project.gradle中定义:

  • sourceSets {
        main {
            java {
                srcDir 'src'
                srcDir 'resources'
            }
            resources { srcDir 'resources' }
        }
        test { java {
            srcDir 'test/unit'
        } }
    }
    
  • 使用 sourceSets.test.output 的依赖项存储在 Builder/dependancies.gradle 中,并为需要运行 MovedProject 测试的每个项目进行设置:

  • project(':SomeMainProject1') {
        dependencies {
            ...
    
            if (noEclipseTask) {
                testCompile project(':Libraries/net.jsdpu').sourceSets.test.output
            }
        }
    }
    

    有什么简单的方法可以消除这个错误并使gradle能够构建具有当前目录结构的项目?我想知道为什么gradle无法看到该属性。

    2个回答

    26
    所提及的代码行存在问题,因为它假定项目:Libraries/MovedLibrary在当前项目之前被评估(而不是执行),但这可能并非事实。如果不是这样,其他项目的源设置还没有配置好。(甚至可能没有sourceSets属性,因为尚未应用java-base插件。)
    一般来说,最好不要访问其他项目的项目模型,特别是如果它们不是当前项目的子项。在A项目使用B项目的测试代码的情况下,推荐的解决方案是让B项目通过artifacts {}块公开一个测试Jar,然后由A项目使用。
    如果您想保持现状,您可以尝试使用gradle.projectsEvaluated {}project.evaluationDependsOn()来解决问题。有关更多信息,请参见Gradle Build Language Reference

    2
    非常感谢!现在一切都构建成功了。使用了 project.evaluationDependsOn() 属性。我想这个解决方案有点不太干净,但是我必须坚持一段时间。 - Mateusz Kubuszok

    0

    我在一个多模块项目中遇到了类似的错误,但是原因很简单,我忘记在配置中应用java-library插件,只使用了maven-publish插件。

    一旦我添加了插件,sourceSets就正常被找到:

    configure(subprojects) {
    apply plugin: 'maven-publish'
    apply plugin: 'java-library'
    ....
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接