Java arquillian jboss as7托管和jacoco-jacoco.exec文件为空
我有一个项目部署在JBoss7.1.3上,并使用arquillian进行测试,我正在尝试向其中添加代码覆盖率指标 我正在使用托管容器选项(jboss作为arquillian容器托管),目前我刚刚尝试将-javaagent参数添加到arquillian用于启动jboss的jvm参数中,因此我的arquillian.xml如下所示: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/
<?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提供完全相同的savejavaagent
参数,那么一切都正常
我做错了什么?好吧,问题是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仍包含该名称下的代理类。我猜你的类加载器结构与我的设置不同。不幸的是,我真的帮不了你。