在将项目导出为jar时删除Jacoco库依赖项

时间:2019-03-22 14:26:05

标签: java android

我之前在我的项目中实施了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文件之外?

2 个答案:

答案 0 :(得分:3)

您的错误已在how to prevent jacoco instrumenting production code?中指定。基本上解释说JaCoCo提供了两种执行检测的方式:on the flyoffline。它还从字面上描述了问题的根源(粗体):

  

此类特定情况之一-是在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”依赖项。

如果您需要进一步的帮助,请告诉我。