Java arquillian jboss as7托管和jacoco-jacoco.exec文件为空

Java arquillian jboss as7托管和jacoco-jacoco.exec文件为空,java,jboss,jboss-arquillian,jacoco,Java,Jboss,Jboss Arquillian,Jacoco,我有一个项目部署在JBoss7.1.3上,并使用arquillian进行测试,我正在尝试向其中添加代码覆盖率指标 我正在使用托管容器选项(jboss作为arquillian容器托管),目前我刚刚尝试将-javaagent参数添加到arquillian用于启动jboss的jvm参数中,因此我的arquillian.xml如下所示: <?xml version="1.0" encoding="UTF-8"?> <arquillian xmlns="http://jboss.org/

我有一个项目部署在JBoss7.1.3上,并使用arquillian进行测试,我正在尝试向其中添加代码覆盖率指标

我正在使用托管容器选项(jboss作为arquillian容器托管),目前我刚刚尝试将-javaagent参数添加到arquillian用于启动jboss的jvm参数中,因此我的arquillian.xml如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<arquillian xmlns="http://jboss.org/schema/arquillian"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://jboss.org/schema/arquillian http://jboss.org/schema/arquillian/arquillian_1_0.xsd">
    <defaultProtocol type="Servlet 3.0"/>

    <engine>
        <property name="deploymentExportPath">/tmp</property>
    </engine>

    <container qualifier="jboss"  default="true">
        <configuration>
            <property name="outputToConsole">true</property>
            <property name="jbossHome">[jboss home]</property>
            <property name="javaHome">[java home]</property>
            <property name="javaVmArguments">-Xmx2048m -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -Djboss.server.log.dir=logs -javaagent:[profile]\.m2\repository\org\jacoco\org.jacoco.agent\0.6.2.201302030002\org.jacoco.agent-0.6.2.201302030002-runtime.jar=destfile=C:\jacoco.exec,includes=*,excludes=,append=true,output=file,classdumpdir=classdumpdir,dumponexit=true</property>
            <property name="startupTimeoutInSeconds">120</property>
            <property name="allowConnectingToRunningServer">true</property>
        </configuration>
    </container>
</arquillian>

/tmp
真的
[jboss主页]
[爪哇主页]
-Xmx2048m-XX:MaxPermSize=256m-XX:+HeapDumpOnOutOfMemoryError-Djboss.server.log.dir=logs-javaagent:[profile]\.m2\repository\org\jacoco\org.jacoco.agent\0.6.2.201302030002-runtime.jar=destfile=C:\jacoc.exec,includes=*,excludes=,examples=,append=true,output=file,classdumpdir=dumpdir=classdumpdir,dumponexit=true
120
真的
我100%确定这个参数被接受了,因为jacoco.exec文件和classdumpdir都被创建了

问题是jacoco.exec文件是空的。jboss已启动,测试已成功运行并完成,jboss已关闭,classdumpdir已填充(因此,根据jacoco规范,这意味着它可以正确查找我的类),但jacoco.exec仍然完全为空

如果我为我自己手动启动的jboss提供完全相同的save
javaagent
参数,那么一切都正常


我做错了什么?

好吧,问题是jacoco只在jvm关闭时才转储文件内容(它为它注册了一个钩子),显然arquillian(至少是我使用的版本?)并没有很好地关闭jvm

最后,我在测试类中添加了以下方法:

@After
public void writeOutJacocoData() {
    try {
        Class rtClass = Thread.currentThread().getContextClassLoader().getParent().loadClass("org.jacoco.agent.rt.RT");
        Object jacocoAgent = rtClass.getMethod("getAgent", null).invoke(null);
        Method dumpMethod = jacocoAgent.getClass().getMethod("dump", boolean.class);
        dumpMethod.invoke(jacocoAgent, false);
    } catch(ClassNotFoundException e) {
        logger.debug("no jacoco agent attached to this jvm");
    } catch (Exception e) {
        logger.error("while trying to dump jacoco data",e);
    }
}

它丑陋而粗野(并且使用了jacoco类,它们不会在任何公开可用的jacoco工件中发布,因此反射)但是有效。

好的,问题是jacoco只在jvm关闭时转储文件内容(它为它注册了一个钩子),显然是arquillian(至少是我使用的版本?)没有很好地关闭jvm

最后,我在测试类中添加了以下方法:

@After
public void writeOutJacocoData() {
    try {
        Class rtClass = Thread.currentThread().getContextClassLoader().getParent().loadClass("org.jacoco.agent.rt.RT");
        Object jacocoAgent = rtClass.getMethod("getAgent", null).invoke(null);
        Method dumpMethod = jacocoAgent.getClass().getMethod("dump", boolean.class);
        dumpMethod.invoke(jacocoAgent, false);
    } catch(ClassNotFoundException e) {
        logger.debug("no jacoco agent attached to this jvm");
    } catch (Exception e) {
        logger.error("while trying to dump jacoco data",e);
    }
}

它丑陋而粗野(并且使用了jacoco类,它们不会在任何公开可用的jacoco工件中发布,因此反射)但是工作正常。

您配置了jacoco扩展吗?请参见此处:我至少会列出扩展,但不包括排除。@JohnAment-尝试添加到我的arquillian xml中-没有任何区别您配置了jacoco扩展吗?请看这里:我至少会列出扩展名,但不包括排除。@JohnAment-尝试添加到我的arquillian xml中-没有任何区别您使用的是什么版本的arquillian?您的设置似乎有其他问题。这对我来说是不可能的。@JohnAment-在这之前,我的安装程序已经在多台机器上运行了数小时的arquillian测试,每天都有数十次。如果你有任何你想让我发布的配置文件,我很乐意。我有一个项目,需要像你一样的步骤。我在@After尝试了你的方法,但是在第一行我得到了一个异常,它没有找到org.jacoco.agent.rt.rt类。我错过了什么?Thanks@FlorinVistig-最新的jacoco 0.7.5仍包含该名称下的代理类。我猜你的类加载器结构与我的设置不同。不幸的是,我真的帮不了你。你用的是什么版本的阿奎利安?你的设置似乎有其他问题。这对我来说是不可能的。@JohnAment-在这之前,我的安装程序已经在多台机器上运行了数小时的arquillian测试,每天都有数十次。如果你有任何你想让我发布的配置文件,我很乐意。我有一个项目,需要像你一样的步骤。我在@After尝试了你的方法,但是在第一行我得到了一个异常,它没有找到org.jacoco.agent.rt.rt类。我错过了什么?Thanks@FlorinVistig-最新的jacoco 0.7.5仍包含该名称下的代理类。我猜你的类加载器结构与我的设置不同。不幸的是,我真的帮不了你。