我之前在我的项目中实施了jacoco。实现就像here所述:
classpath "org.jacoco:org.jacoco.core:0.8.3"
我对此没有任何问题。 (假设这是项目1)
但是事情是每当我将项目导出到.jar文件时。我使用.jar文件的第二个项目(假设项目2)在运行时给出了该错误:
java.lang.NoClassDefFoundError: Failed resolution of: Lorg/jacoco/agent/rt/internal_8ff85ea/Offline;
at
我已经跟踪了有关库的错误,但是实际上我不想导出与项目1中的jacoco相关的任何内容,因为在jar文件中包含该内容对我来说似乎毫无意义。
如何将jacoco排除在jar文件之外?
答案 0 :(得分:3)
您的错误已在how to prevent jacoco instrumenting production code?中指定。基本上解释说JaCoCo提供了两种执行检测的方式:on the fly
和offline
。它还从字面上描述了问题的根源(粗体):
此类特定情况之一-是在Android上执行测试, 因为无法在其上使用Java代理。所以AFAIK Android 当指示Gradle插件使用JaCoCo测量覆盖率时, 使用离线检测,因此需要两种类型的构建 -有报道但没有发布。
因此,您需要生成要发布的jar。实际上,在您用作基准的示例中,它为您提供了针对该发行版禁用testCoverage的解决方案(进行了一些小的更正):
buildTypes {
release {
// Your release part, disable testCoverage
testCoverageEnabled false
}
debug {
//your debug part
//add tests coverage using Jacoco
testCoverageEnabled true
}
}
更新:找到了此workaround for maven。
不应该在每个版本上都进行乐器测试。您不希望发布检测到的代码,首先因为这是一种不好的做法,除非jacocoagent.jar位于类路径中,否则第二个代码将无法运行。
尝试手动下载jacocoagent.jar并将其包含在类路径中(我没有时间对其进行测试)。
答案 1 :(得分:0)
您可以在项目中创建一个单独的“ Java库”模块,并且不要在该模块中添加“ Jacoco”依赖项。您可以只保留要导出到该模块中的核心逻辑。当您构建该项目时,将在项目的'{module_name} / build /'文件夹中创建一个.jar文件。
您还需要在主模块“ app”中添加此新模块依赖项。并在“ app”模块中添加“ Jacoco”依赖项。
如果您需要进一步的帮助,请告诉我。