web-dev-qa-db-ja.com

Jacoco-「原因:Java.lang.ClassNotFoundException:org.jacoco.agent.rt.internal_6da5971.Offline」

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]
###############

続く手順:

  1. 「mvnコンパイル」。
  2. "mvn org.jacoco:jacoco-maven-plugin:instrument"
  3. 「mvntest」-このステップで例外が発生しました。

この例外を取り除く方法を教えてください。それはクラスパスを追加するのに適切な場所でしたか? (surefireプラグイン内)ORどこかで指定する必要がありますか?

ありがとうございました。

5
gthy

Surefireプラグインのクラスパスのものは必要ありません。次のように、テストがある各モジュールに依存関係を追加する必要があります。

<dependency>
    <groupId>org.jacoco</groupId>
    <artifactId>org.jacoco.agent</artifactId>
    <classifier>runtime</classifier>
    <scope>test</scope>
    <version>${your.jacoco.version}</version>
</dependency>

「分類子」の部分を見逃さないように注意してください。そうしないと、機能しません。

PowerMockプロジェクトの完全な例

6
zman0900

マクファール博士のトランス記事 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

1
Tihomir Mateev