Mavenプロジェクトのオフラインインストルメンテーション(オンザフライインストルメンテーションを使用できない:powermockテストケースのため)を使用してjacoco経由でカバレッジを取得しようとしています。以下に示すように、surefireプラグインのクラスパスにjacocoagent.jarを追加しました。 「org.jacoco.agent-0.7.7.201606060606-runtime.jar」(ローカルmavenリポジトリから)の名前を「jacocoagent.jar」に変更し、このpom.xmlが存在するのと同じフォルダーに保存しました。以下を参照してください。クラスパスに追加した後でも例外。
pom.xmlのスニペット(surefire-プラグイン構成)
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<forkmode>once</forkmode>
<additionalClasspathElements>
<additionalClasspathElement>jacocoagent.jar</additionalClasspathElement>
</additionalClasspathElements>
</configuration>
</plugin>
コンソールで見られる例外:
#############
Number of foreign imports: 1
import: Entry[import from realm ClassRealm[maven.api, parent: null]]
-----------------------------------------------------
at org.Apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.Java:166)
... 21 more
Caused by: Java.lang.NoClassDefFoundError: org/jacoco/agent/rt/internal_6da5971/Offline
at com.Cisco.ise.ups.modelframework.hibernate.OracleNamingStrategy.$jacocoInit(OracleNamingStrategy.Java)
at com.Cisco.ise.ups.modelframework.hibernate.OracleNamingStrategy.<clinit>(OracleNamingStrategy.Java)
at Sun.misc.Unsafe.ensureClassInitialized(Native Method)
at Sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.Java:43)
at Sun.reflect.ReflectionFactory.newFieldAccessor(ReflectionFactory.Java:142)
at Java.lang.reflect.Field.acquireFieldAccessor(Field.Java:1082)
at Java.lang.reflect.Field.getFieldAccessor(Field.Java:1063)
at Java.lang.reflect.Field.get(Field.Java:387)
at com.Cisco.ise.ups.build.WorkflowRunnerMojo.namingStrategyInstance(WorkflowRunnerMojo.Java:335)
at com.Cisco.ise.ups.build.WorkflowRunnerMojo.setupWorkflowEnvironment(WorkflowRunnerMojo.Java:514)
at com.Cisco.ise.ups.build.WorkflowRunnerMojo.execute(WorkflowRunnerMojo.Java:816)
at org.Apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.Java:134)
... 21 more
Caused by: Java.lang.ClassNotFoundException: org.jacoco.agent.rt.internal_6da5971.Offline
at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.Java:50)
at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass(ClassRealm.Java:271)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.Java:247)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.Java:239)
... 33 more
[ERROR]
###############
続く手順:
この例外を取り除く方法を教えてください。それはクラスパスを追加するのに適切な場所でしたか? (surefireプラグイン内)ORどこかで指定する必要がありますか?
ありがとうございました。
Surefireプラグインのクラスパスのものは必要ありません。次のように、テストがある各モジュールに依存関係を追加する必要があります。
<dependency>
<groupId>org.jacoco</groupId>
<artifactId>org.jacoco.agent</artifactId>
<classifier>runtime</classifier>
<scope>test</scope>
<version>${your.jacoco.version}</version>
</dependency>
「分類子」の部分を見逃さないように注意してください。そうしないと、機能しません。
マクファール博士のトランス記事 Sonar + JaCoCo + PowerMockが私のために仕事をしてくれました:
<!-- Provide information for coverage per test -->
<profile>
<id>coverage-per-test</id>
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20</version>
<configuration>
<argLine>${argLine} -Xverify:none</argLine>
<properties>
<property>
<name>listener</name>
<value>org.sonar.Java.jacoco.JUnitListener</value>
</property>
</properties>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.sonarsource.Java</groupId>
<artifactId>sonar-jacoco-listeners</artifactId>
<version>4.9.0.9858</version>
<scope>test</scope>
</dependency>
</dependencies>
</profile>
ブログ投稿のコメントセクションで述べたように:
デフォルトのargLineが「単純」でない場合は、次のスニペットを使用する必要があります。
{argLine} -XX:-UseSplitVerifier
そうしないと、ClassNotFoundExceptionが発生する可能性があります。 Java.lang.ClassNotFoundException:org.jacoco.agent.rt.RT