2016-03-30 4 views
10

У нас есть проект Maven с несколькими модулями, состоящий из родительского (HelloWorld) и разных дочерних (HelloWorldServices и HelloWorldPresentation) и использующий Jenkins для сборки.JaCoCo с Maven - отсутствует файл данных выполнения

Ошибка после запуска успешного теста является

[INFO] --- jacoco-maven-plugin:0.7.6.201602180812:report (default-cli) @ HelloWorldServices --- 
[INFO] Skipping JaCoCo execution due to missing execution data file:/var/lib/jenkins/workspace/HelloWorld/HelloWorldServices/target/jacoco.exec 

линии, прежде чем он говорит

[INFO] --- jacoco-maven-plugin:0.7.6.201602180812:prepare-agent (default-cli) @ HelloWorldServices --- 
[INFO] argLine set to -javaagent:/var/lib/jenkins/.m2/repository/org/jacoco/org.jacoco.agent/0.7.6.201602180812/org.jacoco.agent-0.7.6.201602180812-runtime.jar=destfile=/var/lib/jenkins/workspace/HelloWorld/HelloWorldServices/target/jacoco.exec 

Это, как я определил родительский ПОМ JaCoCo плагин:

<plugin> 
    <groupId>org.jacoco</groupId> 
    <artifactId>jacoco-maven-plugin</artifactId> 
    <version>0.7.6.201602180812</version> 
    <configuration> 
     <destfile>${project.artifactId}/target/jacoco.exec</destfile> 
     <datafile>${project.artifactId}/target/jacoco.exec</datafile> 
    </configuration> 

    <executions> 
     <execution> 
      <id>jacoco-initialize</id> 
      <goals> 
       <goal>prepare-agent</goal> 
      </goals> 
     </execution> 
     <execution> 
      <id>jacoco-site</id> 
      <phase>package</phase> 
      <goals> 
       <goal>report</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

В не помню, я явно упомянул верный огонь. Я также пробовал то, что вы везде находите, чтобы поставить argLine в конфигурацию, но все с тем же результатом. Файл JaCoCo .exec никогда не был создан, независимо от того, что я делаю. Что касается целей, я использую

mvn clean install jacoco:prepare-agent jacoco:report 

Так, когда я опускаю цели jacoco, она даже и не отображается сообщение INFO.

+1

попробуйте 'mvn clean jacoco: make-agent install' вместо этого (агент между двумя фазами) –

ответ

18

Вы не должны вызывать агента после установки фазы, но перед тем, так что вместо вызова:

mvn clean install jacoco:prepare-agent jacoco:report 

Вы должны вызывать

mvn clean jacoco:prepare-agent install jacoco:report 

Основная причина: агент не будет участвовать в жизненный цикл сборки, фаза test уже будет выполняться как часть фазы install, тогда Maven будет выполнять агент в соответствии с вызовом командной строки, но будет слишком поздно.


Вы, вероятно, следует также изменить конфигурацию плагина выше:

<plugin> 
    <groupId>org.jacoco</groupId> 
    <artifactId>jacoco-maven-plugin</artifactId> 
    <version>0.7.6.201602180812</version> 
    <executions> 
     <execution> 
      <id>jacoco-initialize</id> 
      <goals> 
       <goal>prepare-agent</goal> 
      </goals> 
     </execution> 
     <execution> 
      <id>jacoco-site</id> 
      <phase>package</phase> 
      <goals> 
       <goal>report</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Примечание: я удалил раздел конфигурации, потому что он был на самом деле указывает на значения по умолчанию. Более того, элементы XML здесь чувствительны к регистру, поэтому ваш элемент datafile был просто проигнорирован, вместо этого он должен был быть dataFile. То же самое относится к destFile.

prepare-agent цель уже использует ${project.build.directory}/jacoco.exec как значение по умолчанию destFile значение, то же самое относится и к значению dataFile для report цели. Основной причиной этого изменения будет более гибкая и стандартная сборка, не полагающаяся на artifactId как имя проекта (по умолчанию, но все еще не обязательная) и используя более общее свойство ${project.build.directory} вместо того, чтобы указывать прямо на target.


Конечная нота: убедитесь, что для настройки расстрелы Jacoco Plugin в разделе build/plugins и не build/pluginManagement/plugins раздел. Раздел pluginManagement предназначен для управления и общей гармонизации версий или конфигураций, но он будет проигнорирован, если соответствующий плагин не будет объявлен под build/plugins.
Согласно official Maven POM reference

pluginManagement: является элементом, который рассматривается вдоль боковых плагинов. Плагин управления содержит элементы плагина почти таким же образом, за исключением того, что вместо того, чтобы настраивать информацию плагина для этой конкретной сборки проекта, он предназначен для настройки сборных проектов, которые наследуются от этого. Однако это только настраивает плагины, которые на самом деле ссылаются на элемент плагинов у детей. Дети имеют полное право переопределять определения pluginManagement.

(примечание: жирный шрифт мой)

+0

что мне нужно сделать, чтобы сделать это, когда вы вызываете только' mvn install'? Если я не буду явно называть цели jacoco, они не будут выполнены. – dasLort

+0

@ dasLort, какую версию Maven вы используете? Я не мог воспроизвести вашу проблему с помощью примера проекта с несколькими модулями, я не получил предупреждения о пропуске и правильно получил отчеты о jacoco –

+0

Maven 3.3.9 и (Jenkins) Maven Integration Plugin 2.12.1. Итак, вы говорите, что вы можете «mvn install», и с помощью вышеперечисленного вызова конфигурации jacoco? – dasLort

2

Я думаю, что «DestFile» и «файл данные» чувствительно к регистру, поэтому постарайтесь заменить их «DestFile» и «DataFile», может быть, это будет работать:)