android - 我如何排除类被 maven-emma 插件检测?

标签 android plugins maven emma

我有一些单元测试(虽然它们是 Android 测试,但我使用的是 Robolectric,因此它们在 JVM 上运行)。他们在没有覆盖的情况下快乐地运行。

当我尝试覆盖时,我从 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 ....似乎已经被检测

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

<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 库项目无意中在某些路径列表中结束了两次),它现在提示我自己的包。


一位同事错误地建议上面的 部分应该放在 中。

事实证明 应该直接在 中并且应该删除剩余的 位,请参阅答案。

最佳答案

我找到了一个解决方案 - 非常简单。

忘记 pluginManagement 的东西:只有通过忽略/this/pom 的过滤器才能“工作”,但将它们应用于任何子 pom:http://maven.apache.org/pom.html#Plugin_Management

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

配置部分紧接在插件元素内,运行“mvn -X emma:emma”显示列出的过滤器。由于每个排除行都改变了我看到的错误,我推断它正在排除。 (我收集到包括,您添加带有 + 前缀的过滤器以覆盖上述 - 前缀的部分。)

<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 - 您应该在其中搜索“覆盖范围”并将其更改为:

<coverage>true</coverage>

到配置 - 几个样本有它,但被注释掉了。我分心了,所以不记得这是否有效,但显然应该有效。

由于我们不想在项目的现有源代码管理中插入目录级别,因此我们创建了名为“parent”和“integration”的目录作为应用程序 pom.xml 的对等目录,使用“parent”来保存父 pom ,以及用于集成测试的“集成”,此部分告诉 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>

关于android - 我如何排除类被 maven-emma 插件检测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9502656/

相关文章:

android - 根据选择微调器的哪个元素更改选项卡内容

android - 在没有目的地的情况下在 Google map 上 x 公里后获取纬度经度?

jquery - 有什么方法可以根据用户的浏览器窗口自动缩放浏览器?

java - camunda 部署 rest API 错误 - 无法处理多部分/表单数据

java - 终止线程似乎不起作用

java - 使用 SpongyCaSTLe 的 RSA

javascript - 通过任何网站插入对 Google+ 事件的评论

javascript - 传入undefined的目的是什么?

java - sshj 0.9.0 抛出 NoClassDefFoundError : net/schmizz/sshj/SSHClient

SVN 修订号和时间戳