java - Gradle在相关测试项目中找不到包

标签 java gradle gradlew multi-project

我正在尝试为嵌套的多项目结构运行./gradlew build,但遇到的问题似乎只出现在具有测试源根目录的项目中。作为Java和Gradle的新手,我敢肯定我打破了多个约定,但我仍然认为这应该可行。

从本质上讲,所有依赖项似乎都很好地添加了,但是当我有一个仅具有Test srcDir的项目,而该项目依赖于另一个具有Test srcDir的项目时,它将无法识别该根项目中的包/符号。但是,具有常规srcDirs的项目(未经测试)似乎没有问题。

我的项目正在进行的工作不止于此,但这是我尝试过的最简单的设置,它可以说明问题。

我的项目结构:

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

我的settings.gradle在qatests中:
rootProject.name = 'QaTests'
include 'BasePageObjects'
include 'BaseTests'
include 'Applications:AppGroupName'
include 'Applications:AppGroupName:AppBasePageObjects'
include 'Applications:AppGroupName:AppBaseTests'

我在qatests中的build.gradle:
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'
                }
            }
        }
    }
}

我不会包括BaseTest项目的build.grade,因为在gradlew构建过程中它似乎可以很好地编译,但这是AppBaseTests的build.gradle:
version '1.0-SNAPSHOT'

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

当我在qatests根目录中运行./gradlew build时,BaseTestsBasePageObjectsAppBasePageObjects项目似乎可以正常编译,并且AppBasePageObjects成功使用了BasePageObjects中的包和符号。但是由于某种原因,AppBaseTests似乎无法识别BaseTests中的包和符号。

如果我从头开始克隆该项目,则IntelliJ会自动运行gradle脚本脚本,并且一切似乎都可以很好地与依赖项一起使用,因此这让我更加困惑。

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

对于它的值(value),这是我在实际构建中看到的第一个错误:
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功能。这似乎只是测试项目所必需的。

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

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

这似乎有点棘手,但可以解决,如果有人有更全面,更明智的答案,请发布!

关于java - Gradle在相关测试项目中找不到包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36725469/

相关文章:

java - 是否可以在 java 中重用字符串?

java - 从 Java 同时使用 MySQL 3.x 和 5.x

java - 在这种情况下如何避免在转换为泛型时发出警告?

android - Travis 构建 - 无法从 key 环文件中检索 key ,因为它不存在

gradle - 将Gradle缓存添加到Sonatype Nexus

gradle - 如何仅在build.gradle中执行特定任务?

java - 没有引用或无法找到引用导致的不确定错误 - java.lang.IndexOutOfBoundsException

java - 如何删除正确的Android fragment 实例

intellij-idea - 无法在 gradle intellij 中添加依赖模块

android - 如何在ubuntu服务器上安装android SDK