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
时,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;
非常感谢任何帮助或建议。如果您想散布一些严厉的侮辱,我也会接受。谢谢。
我相信我在阅读此处的另一个解决方案时找到了答案:
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!
我正在尝试 运行 ./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
时,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;
非常感谢任何帮助或建议。如果您想散布一些严厉的侮辱,我也会接受。谢谢。
我相信我在阅读此处的另一个解决方案时找到了答案: 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!