生成报告期间未找到源文件
Source file was not found during generation of report
请帮助我了解问题所在。
我曾参与多模块项目并遇到过一个问题。
我的架构如下所示:
proj1
-src
--main
---java
----com.myProj.myApi
-----directories containing .java files
... // same proj2 and proj3
rootProject src
-main
--java
---com.myProj.myApi
----Application.java
-test
--test .java files
在根 gradle 中,我定义了以下内容:
- 带有项目名称的变量。
- 测试useTestNG()后,jacocoTestReport()任务启动。
- 在 jacocoTestReport() 内部,我确定了哪些 java 文件需要加载和检查。
我的根 build.gradle:
repositories {
mavenLocal()
mavenCentral()
tasks.withType(Javadoc).all { enabled = false }
tasks.withType(JavaCompile).all { options.encoding = 'UTF-8' }
}
group = 'com.myProj.myApi'
version = '1.0.0-SNAPSHOT'
apply plugin: 'java'
apply plugin: 'jacoco'
apply plugin: 'java-library'
jacoco {
toolVersion = "0.8.5"
}
def otherProjects = [':proj1', ':proj2', ':proj3']
test {
useTestNG()
finalizedBy jacocoTestReport
}
otherProjects.each {
evaluationDependsOn it
}
jacocoTestReport {
FileTree sourceTree = files().getAsFileTree()
FileTree classTree = files().getAsFileTree()
otherProjects.each {
sourceTree += project(it).sourceSets.main.allJava
classTree += project(it).sourceSets.main.output.asFileTree
}
sourceTree = sourceTree.matching {
exclude '**/nonTestedClass.java'
}
classTree = classTree.matching {
exclude '**/nonTestedClass.class'
}
getAdditionalSourceDirs().setFrom(sourceTree)
getAdditionalClassDirs().setFrom(classTree)
reports {
html.enabled = true
xml.enabled = true
csv.enabled = false
}
}
dependencies {
implementation project(':proj1')
implementation project(':proj2')
implementation project(':proj3')
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.testng:testng'
}
Gradle 版本为 7.0.1。 Java11。
我看过 ,但我的每个项目的路径都是正确的,正如您在架构中看到的那样。
编辑 1
我发现在每个子项目中,构建目录仅包含特定子项目中那些 java 文件的 class 文件。也许这是问题所在?也许我需要将所有 class 文件发送到根构建目录?
P.S。 build.gradle 个子项目不包含任何 jacoco 设置。
编辑 2
我已经为 getAdditional...Dirs() 添加了 print 并了解到所有路径都是正确的并且已找到。
终端也给了我这个信息:
> Task :jacocoTestReport
[ant:jacocoReport] Classes in bundle 'myProj' do no match with execution data. For report generation the same class files must be used as at runtime.
但这很奇怪,因为当我添加这段代码时
println(JavaVersion.current())
我得到了这个结果:Java 版本:11。这是我 Java:
的正确版本
$ java --version
openjdk 11.0.11 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.20.04)
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.20.04, mixed mode, sharing)
也许com.myProj.myApi
是一个目录?而它应该是 3 个相互嵌套的目录 com
/ myProj
/ myApi
我在更改文件工作时修复了它。我删除了从 'jacocoTestReport {' 到 'reports {' 的所有代码(不包含)并插入:
for (proj in otherProjects) {
sourceSets project(module).sourceSets.main
}
我不明白为什么 getAdditionalSourceDirs() 和 getAdditionalClassDirs() 不起作用。或者,很可能,我不知道这两种与文件交互的方法之间的区别。知道的可以在这个回答下评论。
请帮助我了解问题所在。 我曾参与多模块项目并遇到过一个问题。 我的架构如下所示:
proj1
-src
--main
---java
----com.myProj.myApi
-----directories containing .java files
... // same proj2 and proj3
rootProject src
-main
--java
---com.myProj.myApi
----Application.java
-test
--test .java files
在根 gradle 中,我定义了以下内容:
- 带有项目名称的变量。
- 测试useTestNG()后,jacocoTestReport()任务启动。
- 在 jacocoTestReport() 内部,我确定了哪些 java 文件需要加载和检查。 我的根 build.gradle:
repositories {
mavenLocal()
mavenCentral()
tasks.withType(Javadoc).all { enabled = false }
tasks.withType(JavaCompile).all { options.encoding = 'UTF-8' }
}
group = 'com.myProj.myApi'
version = '1.0.0-SNAPSHOT'
apply plugin: 'java'
apply plugin: 'jacoco'
apply plugin: 'java-library'
jacoco {
toolVersion = "0.8.5"
}
def otherProjects = [':proj1', ':proj2', ':proj3']
test {
useTestNG()
finalizedBy jacocoTestReport
}
otherProjects.each {
evaluationDependsOn it
}
jacocoTestReport {
FileTree sourceTree = files().getAsFileTree()
FileTree classTree = files().getAsFileTree()
otherProjects.each {
sourceTree += project(it).sourceSets.main.allJava
classTree += project(it).sourceSets.main.output.asFileTree
}
sourceTree = sourceTree.matching {
exclude '**/nonTestedClass.java'
}
classTree = classTree.matching {
exclude '**/nonTestedClass.class'
}
getAdditionalSourceDirs().setFrom(sourceTree)
getAdditionalClassDirs().setFrom(classTree)
reports {
html.enabled = true
xml.enabled = true
csv.enabled = false
}
}
dependencies {
implementation project(':proj1')
implementation project(':proj2')
implementation project(':proj3')
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.testng:testng'
}
Gradle 版本为 7.0.1。 Java11。
我看过
编辑 1 我发现在每个子项目中,构建目录仅包含特定子项目中那些 java 文件的 class 文件。也许这是问题所在?也许我需要将所有 class 文件发送到根构建目录? P.S。 build.gradle 个子项目不包含任何 jacoco 设置。
编辑 2 我已经为 getAdditional...Dirs() 添加了 print 并了解到所有路径都是正确的并且已找到。 终端也给了我这个信息:
> Task :jacocoTestReport
[ant:jacocoReport] Classes in bundle 'myProj' do no match with execution data. For report generation the same class files must be used as at runtime.
但这很奇怪,因为当我添加这段代码时
println(JavaVersion.current())
我得到了这个结果:Java 版本:11。这是我 Java:
的正确版本$ java --version
openjdk 11.0.11 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.20.04)
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.20.04, mixed mode, sharing)
也许com.myProj.myApi
是一个目录?而它应该是 3 个相互嵌套的目录 com
/ myProj
/ myApi
我在更改文件工作时修复了它。我删除了从 'jacocoTestReport {' 到 'reports {' 的所有代码(不包含)并插入:
for (proj in otherProjects) {
sourceSets project(module).sourceSets.main
}
我不明白为什么 getAdditionalSourceDirs() 和 getAdditionalClassDirs() 不起作用。或者,很可能,我不知道这两种与文件交互的方法之间的区别。知道的可以在这个回答下评论。