Покрытие Cobertura Runtime на сервере JBoss

Я изучал покрытие кода Cobertura для веб-приложения Java во время выполнения и наткнулся на статью http://www.mojohaus.org/cobertura-maven-plugin/instrumentingDeploymentArtifact.html

Я выполнил шаги и смог получить отчеты о покрытии небольшого веб-приложения maven, где я развернул военный файл (содержащий один модуль) на сервере JBoss и вручную просмотрел развернутое приложение.

Теперь, когда я следовал той же процедуре и шагам для более крупного приложения, где нам нужно развернуть файл уха (содержащий военный файл нескольких модулей) в той же настройке, и я вручную нажал на службы приложений, но я не смог получить какое-либо покрытие для Это. Сначала создается пустой файл cobertura.ser, но он не обновляется.

Пожалуйста, дайте мне знать, если есть проблема с ear/war или чем-то еще, что необходимо настроить на сервере JBoss.

заранее спасибо


person Ayush    schedule 10.09.2015    source источник


Ответы (1)


Известное условие для Cobertura заключается в том, что он записывает покрытие кода во время выключения JVM, т. е. регистрирует ловушку выключения и в это время выгружает информацию в файл. Проблема в том, что JBoss обычно останавливает JVM до того, как сможет выполнить большинство перехватчиков выключения, и это влияет на Cobertura. См. этот FAQ: Я использую JBoss. Когда я останавливаю сервер, файл данных покрытия не записывается.

Часто задаваемые вопросы рекомендуют использовать

  -Djboss.shutdown.forceHalt=false

Теперь другим распространенным решением является включение CoberturaFlush.war (часть дистрибутива) в ваш EAR и вызов специального URL-адреса, который заставит среду выполнения Cobertura сбрасывать свои данные в файл. Вам нужно вызвать этот URL перед закрытием сервера/приложения, обычно это http://HOST:PORT/coberturaFlush/flushCobertura

И последнее: файл данных будет создан в рабочем каталоге по умолчанию, поэтому часто безопаснее явно указывать путь к файлу с помощью:

 -Dnet.sourceforge.cobertura.datafile=[absolute file path]

В вашем случае это нужно будет добавить в параметры запуска JBoss (например, run.conf)

person Patrice M.    schedule 11.09.2015
comment
при выключении сервера JBoss я получаю следующую ошибку. 10:45:58,693 ОШИБКА [stderr] (Thread-67) Исключение в потоке Thread-67 java.lang.IllegalAccessError: попытка доступа к классу net.sourceforge.cobertura.coveragedata.TouchCollector$ApplyToClassDataLightClassmapListener из класса net.sourceforge.cobertura.coveragedata .TouchCollector Я использую cobertura-2.1.1.jar - person Ayush; 11.09.2015
comment
Какой из двух вариантов вы пробовали? В первом случае возможно, что выгрузка классов JBoss мешает, например, если ваша банка cobertura находится в EAR, которая не развернута, а классы выгружены до (или одновременно с?) ловушкой выключения. В этом случае решение WAR может работать лучше, или вместо этого попробуйте поместить jar среды выполнения Cobertura в папку jboss/server/main/lib/. - person Patrice M.; 11.09.2015
comment
Мне удалось устранить обсуждаемую ошибку, понизив версию jar cobertura до cobertura-2.0.3.jar. Теперь все шаги работают нормально, за исключением того, что я не могу собрать данные о покрытии. Я даже пробовал -Djboss.shutdown.forceHalt=false, а также HOST:PORT/coberturaFlush/flushCobertura, но ни один из шагов не увенчался успехом. - person Ayush; 11.09.2015
comment
Есть ли доступный журнал, когда что-то не работает? Или что бы вы ни пытались, этот файл .ser просто не создается? Кроме того, может случиться так, что файл создан в другом месте, чем вы ожидаете, я дополню ответ этой информацией. - person Patrice M.; 12.09.2015
comment
файл ser был создан где-то еще, т.е. в моем случае он создавался в структуре папок, аналогичной структуре задания сборки (**target/cobertura/cobertura.ser). . теперь установка работает нормально. - person Ayush; 24.09.2015