2012-09-04 24 views
16

Я настроил плагин Maven JaCoCo следующим образом в моем файле pom.xml:Maven JaCoCo ошибка плагин

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <jacoco.version>0.5.9.201207300726</jacoco.version> 
</properties> 

<profiles> 
    <profile> 
     <id>jacoco4</id> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.jacoco</groupId> 
        <artifactId>jacoco-maven-plugin</artifactId> 
        <version>${jacoco.version}</version> 
        <executions> 
         <execution> 
          <goals> 
           <goal>prepare-agent</goal> 
          </goals> 
          <configuration 
          <destfile>${project.build.directory}/target/jacoco.exec</destfile> 
          <datafile>${project.build.directory}/target/jacoco.exec</datafile> 
           <output>file</output> 
           <append>true</append> 
          </configuration> 
         </execution> 
         <execution> 
          <id>report</id> 
          <phase>prepare-package</phase> 
          <goals> 
           <goal>report</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
</profiles> 

Я использую Windows 7 и плагин для Apache Maven-3.0.4. Когда я набираю mvn -P jacoco4 install, либо с терминала cygwin, либо с терминала командной строки, Maven загружает и запускает плагин JaCoCo, но тогда файл jacoco.exec, похоже, не был создан. Ниже приводится сообщение об ошибке:

[ERROR] Unable to read execution data file C:\Users\brownru\workspace64new\vps9\vps-fileserver\target\jacoco.exec: C:\Users\brownru\workspace64new\vps9\vps-fileserver\target\jacoco.exec (The system cannot find the file specified) 
java.io.FileNotFoundException: C:\Users\brownru\workspace64new\vps9\vps-fileserver\target\jacoco.exec (The system cannot find the file specified) 
     at java.io.FileInputStream.open(Native Method) 
     at java.io.FileInputStream.<init>(FileInputStream.java:120) 
     at org.jacoco.maven.ReportMojo.loadExecutionData(ReportMojo.java:251) 
     at org.jacoco.maven.ReportMojo.executeReport(ReportMojo.java:228) 
     at org.jacoco.maven.ReportMojo.execute(ReportMojo.java:217) 
     at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101) 
     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209) 
     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) 
     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) 
     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84) 
     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59) 
     at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183) 
     at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161) 
     at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320) 
     at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156) 
     at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537) 
     at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196) 
     at org.apache.maven.cli.MavenCli.main(MavenCli.java:141) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352) 

Это сообщение об ошибке или не включать меня в destfile и datafile спецификаторов в конфигурации плагина:

<destfile>${project.build.directory}/target/jacoco.exec</destfile> 
<datafile>${project.build.directory}/target/jacoco.exec</datafile> 

Может кто-то пожалуйста, скажите мне, что я делать не так?

ответ

0

Я использую конфигурации:

<plugin> 
     <groupId>org.jacoco</groupId> 
     <artifactId>jacoco-maven-plugin</artifactId> 
     <version>${jacoco.version}</version> 
      <configuration> 
        <skip>${skipTests}</skip> 
      </configuration> 
      <executions> 
        <execution> 
           <id>jacoco-initialize</id> 
           <phase>initialize</phase> 
           <goals> 
            <goal>prepare-agent</goal> 
           </goals> 
          </execution> 
          <execution> 
           <id>jacoco-site</id> 
           <phase>package</phase> 
           <goals> 
            <goal>report</goal> 
           </goals> 
          </execution> 
      </executions> 
     </plugin> 

Update: конфигурации генерируется с помощью сонара (эхолота-pom.xml):

<plugin> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.12</version> 
     <executions> 
      <execution> 
      <id>default-test</id> 
      <phase>test</phase> 
      <goals> 
       <goal>test</goal> 
      </goals> 
      <configuration> 
       <excludedGroups>server,ignore,integration</excludedGroups> 
      </configuration> 
      </execution> 
     </executions> 
     <configuration> 
      <excludedGroups>server,ignore,integration</excludedGroups> 
      <argLine>-javaagent:/tmp/jacocoagent3671192291664069011.jar=destfile=target/jacoco.exec,excludes=*_javassist_*</argLine> 
      <testFailureIgnore>true</testFailureIgnore> 
     </configuration> 
     </plugin> 

Одна проблема - как определить "jacocoagent3671192291664069011.jar" для каждой сборки. Он должен быть в:

$M2_HOME/repository/org/jacoco/org.jacoco.agent/${jacoco.version}/org.jacoco.agent-${jacoco.version}-runtime.jar 
+0

@kirigiri вы пробовали мою конфигурацию? –

+0

Спасибо за ваш ответ, которого я не видел до сегодняшнего дня. Я попробовал вашу конфигурацию, за исключением $ {skipTests}, но ваша конфигурация не решила проблему. У тебя есть другие идеи? – kirigiri

+0

Вы правы. Я просто скопировал из своего проекта (родительский пом). Тесты пропускаются для некоторых модулей. Я использую jenkins с гидролокатором (и jacoco). Там вам не нужно запускать jacoco вручную. –

21

У меня была такая же проблема с jacoco и maven. Это было связано с родительским pom, переписывающим конфигурацию surefire. В этом случае этот плагин не использовал аргумент (для аргумента jvm), определяющий агент.

Решение был поместить элемент конфигурации «argLine» назад

<plugin> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <configuration> 
    <argLine>${argLine}</argLine> 
    </configuration> 
</plugin> 

Полный плагин конф выглядит

<plugin> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <configuration> 
    <skip>true</skip> 
    </configuration> 
    <executions> 
    <execution> 
     <id>unit-test</id> 
     <phase>test</phase> 
     <goals> 
     <goal>test</goal> 
     </goals> 
     <configuration> 
     <skip>${maven.test.skip}</skip> 
     <argLine>${argLine}</argLine> 
     <excludes> 
      <exclude>**/*IntegrationTest.java</exclude> 
     </excludes> 
     </configuration> 
    </execution> 
    <execution> 
     <id>integration-test</id> 
     <phase>integration-test</phase> 
     <goals> 
     <goal>test</goal> 
     </goals> 
     <configuration> 
     <skip>${skipITs}</skip> 
     <argLine>${argLine}</argLine> 
     <includes> 
      <include>**/*IntegrationTest.java</include> 
     </includes> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 
<plugin> 
    <groupId>org.jacoco</groupId> 
    <artifactId>jacoco-maven-plugin</artifactId> 
    <version>0.5.10.201208310627</version> 
    <configuration> 
     <skip>${maven.test.skip}</skip> 
     <destFile>${basedir}/target/coverage-reports/jacoco-unit.exec</destFile> 
     <dataFile>${basedir}/target/coverage-reports/jacoco-unit.exec</dataFile> 
     <output>file</output> 
     <append>true</append> 
    </configuration> 
    <executions> 
     <execution> 
      <id>jacoco-initialize</id> 
      <goals> 
       <goal>prepare-agent</goal> 
      </goals> 
     </execution> 
     <execution> 
      <id>jacoco-site</id> 
      <phase>verify</phase> 
      <goals> 
       <goal>report</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Надеется, что это будет полезно

+3

, добавив $ {argLine} работал для меня. Просто не забудьте добавить его в плагин сборки, а не в плагин отчетов (как, например, я попытался). Благодарю. –

+0

Большое спасибо Как привести его на сайт, в настоящее время его отдельный сайт –

+0

Спасибо. Думаю, нужно быть осторожным при переопределении конфигурации по умолчанию для плагина maven. – dkateros

7

я наткнулся на это Проблема: JaCoCo не выводит выходной файл 'jacoco.exec', что означает, что анализ покрытия кода не происходит.

В моем случае это было также связано с использованием пользовательской argLine в плагине Maven Surefire, которая переопределила плагин JaCoCo Maven PlugLine, в результате чего JaCoCo не был выполнен.

Чтобы исправить это, я использовал дополнительный параметр JaCoCo «ИмениСвойство» экспортировать свою argLine свойству Maven и включал, что в Surefire argLine:

<plugin> 
    <groupId>org.jacoco</groupId> 
    <artifactId>jacoco-maven-plugin</artifactId> 
    <configuration> 
     <propertyName>jacoco.agent.argLine</propertyName> 
    </configuration> 
    ...    
</plugin> 

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.10</version> 
    <configuration> 
     <argLine>-XX:-UseSplitVerifier ${jacoco.agent.argLine}</argLine> 
    </configuration> 
</plugin> 

Однако это вызвало проблему, когда отдельные тесты были проведены в Netbeans. Поскольку плагин JaCoCo не был выполнен в этом сценарии, переменная «jacoco.agent.argLine» не была инициализирована, и Surefire не удалось выполнить какие-либо тесты.

Добавление пустого свойства «jacoco.agent.argLine» в pom решило проблему при выполнении отдельных тестов, но это также остановило JaCoCo на экспорте своей argLine при ее выполнении, эффективно отключив JaCoCo.

Заключительная часть решения, которое я использовал, чтобы добавить профиль, который создает пустое свойство, и активируется только при указании одного теста:

<profiles> 
    <profile> 
     <activation>     
      <property> 
       <name>test</name>  
      </property> 
     </activation> 
     <properties> 
      <jacoco.agent.argLine></jacoco.agent.argLine> 
     </properties> 
    </profile> 
</profiles> 
+0

Спасибо! Этот последний бит об тестовом профиле был тем, что я искал. – nzhenry

13

Хорошо, я думаю, что я понял, что продолжается.

По умолчанию jacoco плагина «прогонов» до фазы тестирования (как правило, он запускает prepare-agent цели во время фазы initialize жизненного цикла), и когда он работает, он просто устанавливает Maven свойство «argLine» к чему-то вроде -javaagent=jacoco.jar

например:

[INFO] argLine set to -javaagent:/usernamed/.m2/repository/org/jacoco/org.jacoco.agent/ 0.5.6.2012/org.jacoco.agent-0.5.6.2012-runtime.jar=destfile=/path/to/target/jacoco.exec

по умолчанию, Maven-безошибочный-плагин в основном «помещает» это свойство (если он установлен на что-либо) к его раздвоенными тест ява процессов, поэтому они получают товар. Пример: java ${argLine ends up here}> -jar /xxx/surefirebooter3741906822495182152.jar

Обычно (без jacoco), если вы хотите также добавить что-то еще из ваших собственных в эту argLine (например, -Xmx1G или тому подобное), вы просто установить его в верных конфигурациях, как

<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <configuration> 
      <argLine>-Xmx1G</argLine> 
      </configuration> 
    </plugin> 

Однако, если вы используете jacoco, вы не можете сделать это обычным способом вы это сделать, установив глобальное свойство, this way вместо:

<properties> 
    <argLine>-Xmx1G</argLine> 
    </properties> 

Если вы установите <configuration><argLine>, тогда он в основном переопределяет системное свойство, поэтому аргументы jacoco не передаются дочернему процессу. Вот почему вы используете путь собственности вместо этого. Если вы укажете свойство argLine, тогда jacoco просто добавит его параметры к тому, что вы укажете, тогда surefire будет использовать его.

Однако, если ваш родительский pom имеет уже установить <configuration><argLine> плагина на что-то? Или, если вы сами это устанавливаете? В основном это значение будет использоваться вместо свойства, которое устанавливает jacoco (вы указали ручное переопределение).

Если вы указали <configuration><argLine> самостоятельно, вы можете изменить этот argLine в свойстве (см. Выше) и удалить <configuration><argLine>, и он должен работать. Если вы не можете контролировать родителя, а родитель указывает что-то для argline, вам нужно пройти маршрут <configuration><argLine>${argLine} -Xmx1G</argLine>. Это означает, что он должен игнорировать то, что родительское значение задает для этого значения, и вместо этого использовать argLine (один набор jacoco для вас). (Мне непонятно, есть ли простой способ «добавить» к значению, которое родительский pom имеет для этого значения, если кто-нибудь знает, как здесь можно комментировать).

Но что делать, если jacoco не запускается для какой-либо цели или какого-либо профиля? Тогда переменная ${argLine} никогда не будет установлен, и вы можете столкнуться с ошибкой, как это:

Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.14:test failed: The forked VM terminated without saying properly goodbye. VM crash or System.exit called ? [ERROR] Command was/bin/sh -c cd ...java '${argLine}' ...

Ну получается, что jacoco только «добавляет» к свойству с именем argLine, когда он работает. Таким образом, вы можете смело добавить <properties><argLine></argLine></properties> к вашему pom (если у вас уже нет этого набора в родительском помпе, вам не нужно ничего добавлять). Если jacoco когда-либо вызывается, он добавляет к нему. Если нет, то устанавливается пустая строка, которая в порядке. Также неясно, есть ли способ «добавить» к значению родителя для свойства, поэтому он либо наследует его, если вы знаете, что он существует, либо указывает его как пустую.

Таким образом, в конце концов, для меня, так как мой вверх по течению (труднодоступном) родительском ПОМ объявил его как

<configuration><argList>${argList}</argList></configuration>

я был вынужден в основном следовать по этому пути, так как он был установлен уже в (из мой контроль) родитель, П Thusly:

<configuration><argList>${argList} -Xmx1G</argList></configuration>

Смежные вопросы