我正在尝试为嵌套的多项目结构运行./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
时,BaseTests
,BasePageObjects
和AppBasePageObjects
项目似乎可以正常编译,并且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/