为什么Gradle+;Jacoco抛出与JAXB类相关的异常?

为什么Gradle+;Jacoco抛出与JAXB类相关的异常?,gradle,jaxb,jacoco,Gradle,Jaxb,Jacoco,我是杰科科的新手,我刚刚认识格雷德尔 因此,在子项目中,我只有: apply plugin: jacoco 当我运行gradle测试时我得到: Caused by: javax.xml.bind.JAXBException: An Error Occurred While Scanning Context Classes! - with linked exception: [java.lang.NoSuchMethodException: Failed to Locate Method fo

我是杰科科的新手,我刚刚认识格雷德尔

因此,在子项目中,我只有:

apply plugin: jacoco
当我运行
gradle测试时
我得到:

Caused by: javax.xml.bind.JAXBException: An Error Occurred While Scanning Context Classes!
 - with linked exception:
[java.lang.NoSuchMethodException: Failed to Locate Method for Element, Name = $jacocoData, MethodName = set$jacocoData, Type = class com.someco.components.thing.stuff.Feedback, Argument Type = class [Z]
    at javolution.xml.internal.annotation.JAXBAnnotatedObjectReaderImpl.<init>(JAXBAnnotatedObjectReaderImpl.java:98)
    at javolution.xml.internal.annotation.JAXBAnnotationFactoryImpl.createJAXBAnnotatedObjectReader(JAXBAnnotationFactoryImpl.java:31)
    at com.someco.commons.util.JaxbUtils.unmarshal(JaxbUtils.java:112)
    ... 47 more
Caused by: java.lang.NoSuchMethodException: Failed to Locate Method for Element, Name = $jacocoData, MethodName = set$jacocoData, Type = class com.someco.components.thing.stuff.Feedback, Argument Type = class [Z
    at javolution.xml.internal.annotation.AbstractJAXBAnnotatedObjectParser.getMethodByXmlName(AbstractJAXBAnnotatedObjectParser.java:533)
    at javolution.xml.internal.annotation.AbstractJAXBAnnotatedObjectParser.scanClass(AbstractJAXBAnnotatedObjectParser.java:281)
    at javolution.xml.internal.annotation.AbstractJAXBAnnotatedObjectParser.registerContextClasses(AbstractJAXBAnnotatedObjectParser.java:149)
    at javolution.xml.internal.annotation.AbstractJAXBAnnotatedObjectParser.registerContextClasses(AbstractJAXBAnnotatedObjectParser.java:143)
    at javolution.xml.internal.annotation.AbstractJAXBAnnotatedObjectParser.registerContextClasses(AbstractJAXBAnnotatedObjectParser.java:143)
    at javolution.xml.internal.annotation.JAXBAnnotatedObjectReaderImpl.<init>(JAXBAnnotatedObjectReaderImpl.java:93)
    ... 49 more
原因:javax.xml.bind.JAXBException:扫描上下文类时出错!
-除此之外:
[java.lang.NoSuchMethodException:未能找到元素的方法,名称=$JacocData,方法名称=设置$JacocData,类型=类com.someco.components.thing.stuff.Feedback,参数类型=类[Z]
JAXBAnnotatedObjectReaderImpl.(JAXBAnnotatedObjectReaderImpl.java:98)
位于javolution.xml.internal.annotation.jaxbannotationfactorympl.createJAXBAnnotatedObjectReader(jaxbannotationfactorympl.java:31)
位于com.someco.commons.util.JaxbUtils.unmarshal(JaxbUtils.java:112)
…还有47个
原因:java.lang.NoSuchMethodException:未能找到元素的方法,名称=$JacocData,方法名称=设置$JacocData,类型=类com.someco.components.thing.stuff.Feedback,参数类型=类[Z
位于javolution.xml.internal.annotation.AbstractJAXBAnnotatedObjectParser.getMethodByXmlName(AbstractJAXBAnnotatedObjectParser.java:533)
位于javolution.xml.internal.annotation.AbstractJAXBAnnotatedObjectParser.scanClass(AbstractJAXBAnnotatedObjectParser.java:281)
位于javolution.xml.internal.annotation.AbstractJAXBAnnotatedObjectParser.registerContextClasses(AbstractJAXBAnnotatedObjectParser.java:149)
位于javolution.xml.internal.annotation.AbstractJAXBAnnotatedObjectParser.registerContextClasses(AbstractJAXBAnnotatedObjectParser.java:143)
位于javolution.xml.internal.annotation.AbstractJAXBAnnotatedObjectParser.registerContextClasses(AbstractJAXBAnnotatedObjectParser.java:143)
JAXBAnnotatedObjectReaderImpl.(JAXBAnnotatedObjectReaderImpl.java:93)
…还有49个

我没有解决方案,但下面是代码的情况。Jacoco动态地将字段和方法插入到类中,并使用它们跟踪覆盖率指标。如果代码使用反射,这可能是一个问题,因为Jacoco的字段是在反射调用中返回的,除非您显式地过滤掉它们。sa这是什么:

我的代码使用反射。为什么用JaCoCo执行时会失败?

为了收集执行数据,JaCoCo对测试中的类进行了插入,这将向类中添加两个成员:一个私有静态字段$JacocData和一个私有静态方法$JacocInit()。这两个成员都标记为合成

请将代码更改为忽略合成成员。这是一种很好的做法,因为Java编译器在某些情况下也会创建合成成员

现在,我对javolution知之甚少,我不确定它是否允许在它拾取的字段上应用过滤器,但这就是我要开始寻找的地方


或者,您可以从jacoco中排除问题类/包,但需要注意的是,您不会测量排除的类/包的测试覆盖率。

因此您需要两个排除。一个用于编译,另一个用于报告。要解决此特定问题,您只需:

test {
    jacoco {
        excludes = [ "com.stuff.ours.jaxb.stuff.*",
                     "javolution.*"]
    }
}

什么是javolution?它显然使用jaxb,并且jacoco在代码中插入的字段存在问题,以跟踪覆盖率——它似乎在抱怨它找不到jacoco私有字段的set方法。“Javolution是一个实时库,旨在使Java或类似Java的/C++应用程序更快、时间更可预测。事实上,使用标准库(延迟初始化、数组大小调整等)很容易破坏时间可预测性,这对于安全关键系统来说是不可接受的。"我可以排除生成的类吗?我可以告诉你,在Gradle的任何地方都不适合这个项目。事实上,在此之前,我不知道那里有任何JAXB。不过,其他地方有很多JAXB,这意味着我们有很多生成的类,其中可能有或可能没有javolution内容。也许这就是我需要的:所以我要尝试的是这里提到的对Javolution的排除:并且我应该预期对我生成的类的进一步排除。好的,问题是您需要两组排除,一组用于报告,另一组用于编译,我假设。