0

我有一个带有三叶草和声纳目标的 ANT 构建,示例命令是

ant clover.all sonar_all

目前我使用

 <clover-setup initstring="${clover.db.file}">
      <fileset dir="${src.dir}">
 ...

target 设置我的源目录以进行三叶草检测。我的测试运行,我得到了预期的三叶草报告。我的声纳目标

  <target name="sonar_all">
    <pathconvert pathsep="," property="echo.path.compile" refid="core.class.path"/>
    <property name="sonar.libraries" value="${echo.path.compile}"/>
    <property name="sonar.sources" value="${src.dir}"/>
    <property name="sonar.projectName" value="Touchpoint"/>
    <property name="sonar.binaries" value="${build.classes.dir}"/>
    <property name="sonar.tests" value=""/>
    <property name="sonar.host.url" value="${sonar.host.url}"/>
    <property name="sonar.jdbc.url" value="${sonar.jdbc.url}"/>
    <property name="sonar.jdbc.driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="sonar.jdbc.username" value="${sonar.jdbc.username}"/>
    <property name="sonar.jdbc.password" value="${sonar.jdbc.password}"/>
    <property name="sonar.exclusions" value=""/>
    <property name="sonar.dynamicAnalysis" value="reuseReports"/>
    <property name="sonar.surefire.reportsPath" value="${build.dir}/utest"/>
    <property name="sonar.clover.reportPath" value="${build.dir}/clover/report/clover.xml"/>
    <property name="sonar.java.source" value="1.6"/>
    <property name="sonar.java.target" value="1.6"/>
    <sonar:sonar key="xx" version="xx" xmlns:sonar="antlib:org.sonar.ant"/>
  </target>

也可以正常工作,但似乎正在处理 clover 检测代码而不是原始源代码,这会导致 findbugs 报告出现问题,因为 clover 检测代码会导致 findbugs 中的多次违规。我的声纳指标很差。目前作为一种解决方法,我们有两个 CI 构建,一个用于 clover,第二个用于声纳,但这意味着我永远无法将代码覆盖率指标和声纳详细信息合二为一。

我尝试使用 clover-instr 目标来确保将检测代码放置在不同的目录中,但由于编译后的代码仍生成到单个类目录中,因此会出现同样的问题。我想知道其他开发人员使用什么策略来解决这个问题。

在最低级别,是否存在由 clover.all 目标设置的属性(即 -Dclover.useCompile=true|false),以向 ant 编译目标指示应该使用 clover 编译器?我喜欢运行默认的 clover.all 目标,然后在声纳目标中删除已检测的源文件和类文件,在没有 clover 选项的情况下重新生成并运行默认的声纳目标。

 ant clover.all clover_off sonar_all

编辑 1:如果在Clover、Ant 和 Findbugs上找到此项目,建议在 ANT 脚本中编译两次。由于 ant 构建只会在我看不到如何在构建中切换属性以确保编译任务运行两次时才加载属性,一次启用三叶草,第二次不启用。

4

1 回答 1

0

这里的基本问题是 clover 生成的源代码和类让 sonar 头疼,但不可能通过 ant 任务分离生成路径。我的破解解决方案是将三叶草后阶段的所有类文件复制到声纳目标开始处的新文件夹中,然后假设它们的名称中有字符串“$__CLR”,则删除三叶草类。然后我指示声纳使用原始类集生成其指标。

<target name="sonar">

   <delete dir="${build.dir}/sonarclasses"/>
   <mkdir dir="${build.dir}/sonarclasses/com"/>
   <copy todir="${build.dir}/sonarclasses/com" verbose="true" failonerror="false">
       <fileset dir="${build.classes.dir}/com" excludes="com/**/*$__CLR*.class"/>
   </copy>

   <pathconvert pathsep="," property="echo.path.compile" refid="core.class.path"/>
   <property name="sonar.libraries" value="${echo.path.compile}"/>
   <property name="sonar.sources" value="${src.dir}"/>
   <property name="sonar.projectName" value="Touchpoint"/>
   <property name="sonar.binaries" value="${build.dir}/sonarclasses"/>
   <property name="sonar.tests" value=""/>
   <property name="sonar.host.url" value="${sonar.host.url}"/>
   <property name="sonar.jdbc.url" value="${sonar.jdbc.url}"/>
   <property name="sonar.jdbc.driverClassName" value="com.mysql.jdbc.Driver"/>
   <property name="sonar.jdbc.username" value="${sonar.jdbc.username}"/>
   <property name="sonar.jdbc.password" value="${sonar.jdbc.password}"/>
   <property name="sonar.exclusions" value=""/>
   <property name="sonar.dynamicAnalysis" value="reuseReports"/>
   <property name="sonar.surefire.reportsPath" value="${build.dir}/utest"/>
   <property name="sonar.clover.reportPath" value="${build.dir}/clover/report/clover.xml"/>
   <property name="sonar.java.source" value="1.6"/>
   <property name="sonar.java.target" value="1.6"/>
   <!--<property name="sonar.findbugs.reportPath" value="${build.dir}/findbugs/findbugs.xml"/>-->
   <sonar:sonar
于 2011-10-18T15:25:30.690 回答