Gradle 在依赖测试项目中找不到包

Gradle can't find package in dependent test project

我正在尝试 运行 ./gradlew build 嵌套的多项目结构,我正在 运行 解决似乎只出现在具有测试源根的项目中的问题。作为 java 和 gradle 的新手,我确信我打破了不止一个惯例,但我仍然认为这应该有效。

基本上,所有依赖项似乎都添加得很好,但是当我有一个项目只有一个测试 srcDir 依赖于另一个有测试 srcDir 的项目时,它无法识别 packages/symbols那个根项目。不过有正规srcDirs(不是测试)的项目好像没有问题。

我的项目比这更多,但这是我尝试过的最简单的设置,它说明了问题。

我的项目结构:

qatests
    /Applications
        /AppGroupName
            /AppBasePageObjects
                /src
            /AppBaseTests
                /src
    /BasePageObjects
        /src
    /BaseTests
        /src

我的 settings.gradle 在 qtests:

rootProject.name = 'QaTests'
include 'BasePageObjects'
include 'BaseTests'
include 'Applications:AppGroupName'
include 'Applications:AppGroupName:AppBasePageObjects'
include 'Applications:AppGroupName:AppBaseTests'

我的 build.gradle 在 qtests:

version '1.0-SNAPSHOT'

allprojects {
    repositories {
        mavenCentral()
    }
}

subprojects{

    if(project.name.contains("Tests")){
        apply plugin: 'java'
        sourceCompatibility = 1.8
        dependencies {
            testCompile group: 'junit', name: 'junit', version: '4.11'
            compile group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '2.+'
        }

        if(project.name != "BaseTests")
        {
            println "$project.name depends on BaseTests"
            dependencies {
                testCompile project(':BaseTests')
            }
        }

        sourceSets {
            test {
                java {

                    srcDir 'src'
                }
            }
        }
    }

    if(project.name.contains("PageObjects")){
        apply plugin: 'java'
        sourceCompatibility = 1.8
        dependencies {
            compile group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '2.+'
        }

        if(project.name !="BasePageObjects")
        {
            dependencies {
                compile project(':BasePageObjects')
            }
        }

        sourceSets {
            main {
                java {

                    srcDir 'src'
                }
            }
        }
    }
}

我不会将我的 build.grade 包含在 BaseTest 项目中,因为它在 gradlew 构建期间似乎编译得很好,但这是我的 build.gradle 的 AppBaseTests:

version '1.0-SNAPSHOT'

dependencies {
    compile 'org.apache.commons:commons-lang3:3.4'
    compile project(':Applications:AppGroupName:AppBasePageObjects')
}

当我在 qtests root 中 运行 ./gradlew build 时,BaseTestsBasePageObjectsAppBasePageObjects 项目似乎可以正常编译并且 AppBasePageObjects 成功使用来自 BasePageObjects 的包和符号。然而,出于某种原因,AppBaseTests 似乎无法识别 BaseTests 中的包和符号。

如果我从头开始克隆这个项目,IntelliJ 运行 会自动执行 gradle 脚本,并且一切似乎开箱即用,依赖项也很好,所以这甚至让我感到困惑更多

我已经尝试为所有项目依赖项添加编译和测试编译,因为这是 AppBasePageObjects 有效和 AppBaseTests 无效之间唯一真正的区别。我还尝试将 compileJava.dependsOn(':BaseTests:build') 添加到 AppBaseTests build.gradle 文件中。还有一些其他的兔子洞,但似乎对这个依赖问题没有任何影响。

值得一提的是,这是我在实际构建中看到的第一个错误:

error: package Tests does not exist import Tests.BaseTest;

非常感谢任何帮助或建议。如果您想散布一些严厉的侮辱,我也会接受。谢谢。

我相信我在阅读此处的另一个解决方案时找到了答案: Multi-project test dependencies with gradle

看来我需要在我的根 build.gradle 文件中使用 testCompile project(':BaseTests').sourceSets.test.output 进行命令行构建,并使用 testCompile project(':BaseTests') 进行 IDE 功能。这似乎只是测试项目所需要的。

这是我的根 build.gradle 文件中的实际更改:

    if(project.name != "BaseTests")
    {
        println "$project.name depends on BaseTests"
        dependencies {
            testCompile project(':BaseTests')
            testCompile project(':BaseTests').sourceSets.test.output
        }
    }

这看起来有点 hacky 但有效,如果有人有更彻底和更聪明的答案,请 post!