如何排除maven-emma插件检测的类?

时间:2012-02-29 16:13:36

标签: android plugins maven emma

我有一些单元测试(虽然他们是Android测试,我使用的是Robolectric,所以他们正在JVM上运行。他们幸福地跑着,没有报道。

当我尝试使用coverage时,我从emma-maven收到此错误:

org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.mojo:emma-maven-plugin:1.0-alpha-3:instrument (default-cli) on project android: Execution default-cli of goal org.codehaus.mojo:emma-maven-plugin:1.0-alpha-3:instrument failed: class [com.larvalabs.svgandroid.ParserHelper] appears to be instrumented already

重要的一点是class .... appears to be instrumented already

很难找到合适的文档,但这是我从各种来源拼凑出的配置:

<plugin>
    <!-- This doesn't work, see below for a working configuration -->
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>emma-maven-plugin</artifactId>
    <version>1.0-alpha-3</version>
    <inherited>true</inherited>                          
    <executions>
            <execution>
                    <phase>process-classes</phase>                               
                    <configuration>
                            <filters>
                                    <filter>-com.viewpagerindicator.*</filter>
                                    <filter>-com.actionbarsherlock.*</filter>
                                    <filter>-com.larvalabs.svgandroid.*</filter>
                            </filters>
                    </configuration>
                    <goals> 
                            <goal>instrument</goal>
                    </goals>
            </execution>
    </executions>
</plugin>

麻烦的是,排除了它抱怨的那些软件包(我认为问题是这些是Android库项目无意中在某些路径列表中无意中结束了两次),现在它正在抱怨我自己的软件包。


一位同事错误地建议&lt;插件&gt;上面的部分应该放在&lt; project&gt;&lt; build&gt;&lt; pluginManagement&gt;。

事实证明&lt;配置&gt;应该直接在&lt; plugin&gt;和剩下的&lt;执行&gt;应删除位,请参阅答案。

3 个答案:

答案 0 :(得分:5)

我找到了一个解决方案 - 令人尴尬的简单。

忘记插件管理的东西:只有&#39;工作&#39;通过使它忽略/ this / pom的过滤器,但将它们应用于任何子poms:http://maven.apache.org/pom.html#Plugin_Management

只需将配置元素移出执行块,然后删除执行块。 http://maven.apache.org/guides/mini/guide-configuring-plugins.html#Generic_Configuration

使用配置部分紧接插件元素内部,使用&m; mvn -X emma:emma&#39;显示了列出的过滤器。由于每个排除行都改变了我看到的错误,我推断它是排除的。 (我收集到包括,你添加带+前缀的过滤器来覆盖前面的部分 - 前缀。)

<project>
 <build>
  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>emma-maven-plugin</artifactId>
    <version>1.0-alpha-3</version>
    <!-- inherited>true</inherited -->
    <configuration>
            <filters>
                    <filter>-com.viewpagerindicator.*</filter>
                    <filter>-com.actionbarsherlock.*</filter>
                    <filter>-com.larvalabs.svgandroid.*</filter>
            </filters>
            <!-- verbose>true</verbose -->
   </configuration>
  </plugin>

到目前为止,问题的隐含的Android部分(实际上使得过滤对我来说没有问题),因为Android需要一个单独的APK来进行测试并运行主要应用程序APK,你根本就没有从同一个项目运行Android集成测试:android插件希望你从一个单独的项目中进行集成测试APK - 通常是同一个父pom文件下的兄弟。在android插件页面上隐藏了一个zip中的示例/示例项目 - http://code.google.com/p/maven-android-plugin/wiki/Samples - 您应该在其中搜索&#39; coverage&#39;并将其更改为:

<coverage>true</coverage>

配置 - 一些样本有它,但注释掉了。我心烦意乱,所以不记得这是否有效,但显然应该这样做。

由于我们不想将目录级别插入到项目的现有源代码管理中,因此我们创建了名为“父级”的目录。和&#39;整合&#39;作为应用程序的pom.xml的同行,使用&#39; parent&#39;举行父母pom,并整合&#39;对于集成测试,本节告诉app / pom.xml使用app / parent / pom.xml:

<project>
    <parent>
            <groupId>our.group.id</groupId>
            <artifactId>base</artifactId>
            <relativePath>parent</relativePath>
            <version>3.9.0</version>
    </parent>

,这在app / integration / pom.xml中:

<project>
  <parent>
    <groupId>our.group.id</groupId>
    <artifactId>base</artifactId>
    <relativePath>../parent</relativePath>
    <version>3.9.0</version>
  </parent>

答案 1 :(得分:2)

据我了解,只有cobertura需要检测类才能生成报告。如果在目标/类中创建它们,它们将覆盖原始类文件。

如果您需要jar中的已检测文件,则可以从目标/ generated-classes目录配置maven-jar-plugin to pick up文件,而不是标准$ {build中的文件。 project.outputDirectory}。

修改

看看maven-jar-plugin说明。要仅使用目标/生成类,应在POM中添加以下内容 - 尝试并根据需要进行修改:

<project>
  ...
  <build>
    <plugins>
      ...
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.3</version> <!-- replace with correct version nbr! -->
        <configuration>
          <includes>
            <include>${project.build.directory}/generated-classes/**/*.class</include>
          </includes>
          <excludes>
            <exclude>${project.build.directory}/classes/**/*.class</include>
          </excludes>

        </configuration>
      </plugin>
      ...
    </plugins>
  </build>
  ...
</project>

${project.build.directory}指向您的目标文件夹,${project.build.ouputDirectory}指向目标/类。我不知道你是否可以简单地将${project.build.ouputDirectory}设置为新值 - 看一下this chapter of the maven book,也许你会找到一些提示

参考:

另外或者另外,在coberture:instrument完成后,您可以使用maven将目标/生成类中的文件复制到目标/类。 This question有一个示例POM(片段)的答案,您只需要确定正确的阶段(流程资源对您的情况来说肯定太早)

另外Refer this

希望它有帮助。!

答案 2 :(得分:0)

请使用mode =“overwrite”。它会工作正常。