【问题标题】:Jacoco - "Caused by: java.lang.ClassNotFoundException: org.jacoco.agent.rt.internal_6da5971.Offline"Jacoco - “引起:java.lang.ClassNotFoundException:org.jacoco.agent.rt.internal_6da5971.Offline”
【发布时间】:2017-02-25 07:40:28
【问题描述】:

尝试通过 jacoco 使用离线仪器(不能使用即时仪器:由于 powermock 测试用例)为 maven 项目获取覆盖。将 jacocoagent.jar 添加到surefire插件的类路径中,如下所示。将“org.jacoco.agent-0.7.7.201606060606-runtime.jar”(来自本地 maven 存储库)重命名为“jacocoagent.jar”并将其保存在该 pom.xml 所在的同一文件夹中。我正在点击以下内容即使将其添加到类路径后也会出现异常。

pom.xml 的 sn-p (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. "mvn test" - 在这一步引发异常。

请告诉我如何摆脱这个异常?那是添加类路径的正确位置吗? (在surefire插件中)或者应该在哪里指定??

谢谢。

【问题讨论】:

  • 我敢打赌,如果需要添加库进行测试,它们应该在 pom 的 &lt;dependencies&gt; 部分中指定,范围=test。
  • @LittleSanti:根据建议调整 pom.xml。仍然存在问题(异常)。在 选项卡下添加了这些行。 org.jacocoorg.jacoco.agenttestruntime0.7.7.201606060606依赖>。 jacocoagent.jar 已经下载并存在于磁盘上。只需要在类路径上提供它,以便检测类可以启动它 (eclemma.org/jacoco/trunk/doc/offline.html)。不确定,还缺少什么!!!
  • 我明白了。嗯...我想到的另一个解决方案是在 plugin's 依赖项中设置该依赖项,因为插件的类加载器可能与测试代码的类加载器不同。
  • @LittleSanti:在上面的代码 sn-p 中,已经在 中提到了。正确的 ?你能告诉我如何在 maven pom.xml 中添加类路径吗?基本上,在工作情况下,命令如下所示:(“ps aux | grep java”的O/P)jre/bin/java -javaagent:/root/.m2/repository/org/jacoco/org. jacoco.agent/0.7.7.201606060606/org.jacoco.agent-0.7.7.201606060606-runtime.jar=destfile=target/jacoco.exec -jar target/surefire/surefirebooter5305632.jar
  • 我知道的将 jars 添加到 pom.xml 中的类路径的唯一方法是前面提到的两种方法:dependencies 节点和 plugins/pugin/dependencies 节点。

标签: maven jacoco maven-surefire-plugin jacoco-maven-plugin


【解决方案1】:

surefire 插件上的类路径不是必需的。您需要为每个具有测试的模块添加一个依赖项,如下所示:

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

确保不要错过“分类器”部分,否则它将不起作用。

Full example from PowerMock project

【讨论】:

    【解决方案2】:

    dr. macphail's trance article 让 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>
    

    正如博文的 cmets 部分所述:

    如果您的默认 argLine 不是“简单”,您可能需要使用以下 sn-p:

    {argLine} -XX:-UseSplitVerifier

    否则你可能会遇到 ClassNotFoundException - 例如java.lang.ClassNotFoundException: org.jacoco.agent.rt.RT

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-21
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多