gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:29:48 29 4
gpt4 key购买 nike

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

我正在使用托管容器选项(jboss-as-arquillian-container-management),现在我刚刚尝试向 arquillian 用于启动 jboss 的 jvm 参数添加一个 -javaagent 参数,所以我的 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>

我 100% 确定该参数已被采纳,因为 jacoco.exec 文件和 classdumpdir 都已创建。

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

如果我向与我自己手动启动的完全相同的 jboss 提供准确的 save javaagent 参数,一切都会正常工作。

我做错了什么?

最佳答案

好吧,问题是 jacoco 仅在 jvm 关闭时转储文件内容(它为其注册了一个钩子(Hook)),并且显然 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 工件中发布这些类,因此存在反射),但是有效。

关于java - arquillian jboss as7 托管和 jacoco - jacoco.exec 文件为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17907858/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com