我试图为嵌套的多项目结构运行./gradlew build
,而且我遇到的问题似乎只出现在具有测试源根的项目中。作为java和gradle的新手,我确信我打破了多个约定,但我仍然认为这应该有效。
基本上,所有依赖项似乎都添加得很好,但是当我有一个项目只有一个Test srcDir依赖于另一个具有Test srcDir的项目时,它不会识别该root中的包/符号项目。但是,定期srcDirs(不测试)的项目似乎没有问题。
我的项目比这更多,但这是我尝试过的最简单的设置来说明问题。
我的项目结构:
qatests
/Applications
/AppGroupName
/AppBasePageObjects
/src
/AppBaseTests
/src
/BasePageObjects
/src
/BaseTests
/src
我的settings.gradle in 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构建期间它似乎编译得很好,但这是我的App.BaseTests的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脚本脚本,所有内容似乎都可以正常使用依赖项,所以这让我更加困惑。
我尝试为所有项目依赖项添加编译和测试编译,因为这是AppBasePageObjects
工作和AppBaseTests
之间唯一真正的区别,它不起作用。我还尝试将compileJava.dependsOn(':BaseTests:build')
添加到AppBaseTests
build.gradle
文件中。还有一些其他兔子洞,但似乎没有任何影响这个依赖性问题。
对于它的价值,这是我在实际构建中看到的第一个错误:
error: package Tests does not exist import Tests.BaseTest;
非常感谢任何帮助或建议。如果你想分发一些严厉的侮辱,我也会采取这些措施。谢谢。
答案 0 :(得分:0)
我相信我在阅读另一个解决方案时找到了答案: Multi-project test dependencies with gradle
在我的root 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
}
}
这看起来有点hacky但有效,如果有人有更彻底和更聪明的答案请发帖!