[英]Maven JaCoCo plugin error
我在我的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插件。 當我從cygwin終端或命令提示終端輸入mvn -P jacoco4 install
,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>
有人可以告訴我我做錯了什么嗎?
我和jacoco和maven有同樣的麻煩。 它與父pom覆蓋了surefire的配置有關。 在這種情況下,該插件沒有使用定義代理的參數(對於jvm參數)。
解決方案是將“argLine”配置元素放回原位
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>${argLine}</argLine>
</configuration>
</plugin>
完整的插件conf看起來像
<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>
希望它會有用
好吧,我想我弄清楚發生了什么。
默認情況下,jacoco插件在測試階段之前“運行”(通常在初始化生命周期階段運行prepare-agent
目標),當它運行時,它只是將名為“argLine”的maven屬性設置為類似-javaagent=jacoco.jar
例如:
[INFO] argLine設置為-javaagent:/usernamed/.m2/repository/org/jacoco/org.jacoco.agent/ 0.5.6.201201232323 / org.jacoco.agent-0.5.6.201201232323-runtime.jar = destfile = / path /到/目標/ jacoco.exec
默認情況下,maven-surefire-plugin基本上將這個屬性(如果它被設置為任何東西)“prepends”到它的分叉java測試進程,所以他們得到了貨物。 例如: 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,則無法通過設置全局屬性以正常方式執行此操作,而是這樣(這是pom的根全局屬性):
<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}
永遠不會被設置,你可能遇到這樣的錯誤:
目標org.apache.maven.plugins的執行默認測試:maven-surefire-plugin:2.14:測試失敗:分叉的虛擬機終止而沒有說再見。 VM崩潰或System.exit調用? [錯誤]命令是/ bin / sh -c cd ... java'$ {argLine}'...
事實證明,當jacoco運行時,它只會“添加”到名為argLine的屬性中。 因此,您可以安全地將<properties><argLine></argLine></properties>
到您的pom中(除非您已在父pom中設置了該設置,否則您無需添加任何內容)。 如果曾經調用jacoco,它會添加它。 如果沒有,它被設置為空字符串,這是好的。 還不清楚是否有一種方法可以“添加”屬性的父級值,所以它要么繼承它,要么知道它存在,要么將其指定為空。
所以,最后對我來說,因為我的上游(無法訪問)父母pom宣稱它是這樣的
<configuration><argList>${argList}</argList></configuration>
我被迫基本上遵循那條路線,因為它已經設置在(我的控制之外)父母pom中,因此:
<configuration><argList>${argList} -Xmx1G</argList></configuration>
注意,如果你的pom中有這個,那么Intellij會抱怨並且“不添加任何設置”給你的單元測試:
<configuration><argLine>${argLine} -DcustomOption=X...</argLine>
但是根本不要聲明一個名為argLine的屬性(即使它在命令行mvn上工作就好了)。 修復/解決:聲明一個空的'argLine'全局屬性,和/或只是將-DcustomOption=X
移動到屬性聲明,見上文。 如果你“只”在屬性聲明中設置它,那么為了讓IntelliJ選擇它,你還需要<configuration><argLine>${argLine}</argLine>...
:|
不幸的是,即使這還不夠,它還是使用了IntelliJ + maven。 不知道為什么。 改變了我解析時間的方式,所以不必弄亂區域(即在代碼中“讓他們正確”)。
我也遇到了這個問題:JaCoCo沒有生成'jacoco.exec'輸出文件,這意味着不會發生代碼覆蓋率分析。
在我的情況下,也是由於在Maven Surefire插件中使用了一個自定義argLine,它覆蓋了JaCoCo Maven插件argLine,導致JaCoCo無法執行。
為了解決這個問題,我使用了JaCoCo可選參數“propertyName”將其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失敗。
向pom添加空白屬性“jacoco.agent.argLine”解決了運行單個測試時的問題,但這也阻止了JaCoCo在執行時導出其argLine,從而有效地禁用了JaCoCo。
我使用的解決方案的最后一部分是添加一個創建空白屬性的配置文件,並僅在指定單個測試時激活:
<profiles>
<profile>
<activation>
<property>
<name>test</name>
</property>
</activation>
<properties>
<jacoco.agent.argLine></jacoco.agent.argLine>
</properties>
</profile>
</profiles>
我遇到了同樣的問題,並通過使用以下命令代替jacoco修復:報告 -
mvn -X org.jacoco:jacoco-maven-plugin:report
Referred - 如何從命令行配置JaCoCo maven插件
我使用配置:
<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>
更新:聲納生成的配置(sonar-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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.