如何排除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 .... 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>

问题是,在排除了它抱怨的那些包之后(我以为问题是这些是安卓库项目,无意中在一些路径列表上出现了两次),它现在抱怨的是我自己的包。


一位同事错误地建议<plugin>部分应该在<项目><build><插件管理>。

事实证明,<configuration>应该直接在<plugin>和剩余的<executions>位,请参阅答案。

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

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

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

配置部分直接位于插件元素内,使用"mvn-Xemma: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>

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

<coverage>true</coverage>

对配置-有几个示例有它,但被注释掉了。我分心了,所以记不清这是否有效,但显然应该有效。

由于我们不想在项目现有的源代码管理中插入目录级别,我们创建了名为"parent"one_answers"integration"的目录,作为应用程序pom.xml的对等目录,使用"parent’保存父pom,并使用"integration’进行集成测试,本节告诉app/pom.xml使用app/pparent/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>

据我所知,cobertura只需要插入指令的类来生成报告。如果在target/classes中创建它们,它们将覆盖原始类文件。

如果您因此需要在jar中插入插入指令的文件,您可以配置maven jar插件从目标/生成的类目录中提取文件,而不是从标准${build.project.outputDirectory}中提取文件。

编辑

看看maven jar插件的描述。要只使用目标/生成的类,以下对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}指向target/classes。我不知道你是否可以简单地将${project.build.ouputDirectory}设置为一个新的值——看看maven书的这一章,也许你会发现一些提示

参考:

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

另请参阅本

希望它能有所帮助

请使用mode="overwrite"。它会很好用的。

最新更新