【问题标题】:SonarQube - Multimodule project based on filesystem hierarchySonarQube - 基于文件系统层次结构的多模块项目
【发布时间】:2013-10-15 20:34:09
【问题描述】:

一些名为 Foo 的 cvsrepository 有几个模块,f.e.模块 1、模块 2、...
构建脚本执行 cvs 签出、编译和构建所有模块的 module.jar。
构建完成后,文件系统如下所示:

Foo/module1/src
           /bin
   /module2/src
           /bin
   ...

现在我想像这样使用声纳任务:
为 MainProject 定义全局声纳属性,如 sonar.username ... sonar.projektName=Foo,为模块定义 sonar.modules=module1.module2,...。
然后遍历模块文件夹,设置模块特定的声纳属性,
像 sonar.projectName (for modulename) sonar.sources, sonar.binaries 等等。
循环工作正常,但似乎声纳希望每个子模块都有一个 build.xml。
所以我需要另一种对模块进行分组的可能性。
我只找到了一个商业插件 => Portfolio Management plugin 但需要另一个解决方案。

-- 编辑--

我已经找到并尝试使用来自 githubdocumentation 的示例,但它们似乎
在每个模块文件夹中都需要一个主构建文件和一个 build.xml。
而我的情况不同。只有一个 build.xml 包含我项目的每个模块的 javac + jar 目标。构建完成后,生成的文件系统看起来像上面提到的。
构建是部署工作流程的一部分,该工作流程由 xmlproperty 文件驱动,其中包含项目名称和该部署作业的所有模块名称等。
现在构建完成后,在下一个 antfile 中,我想通过 xmltask 循环该 xmlproperty 文件中的模块,将模块特定属性指向文件系统,f.e. sonar.sources=/Foo/module1/src sonar.binaries=/Foo/module1/bin 并调用 <sonar:sonar/> 。循环中模块特定属性的覆盖是通过Flaka<let>
完成的 毕竟,它只是在现有文件系统上循环设置声纳属性并调用具有适当属性的声纳任务。
-- 评论后编辑--
试过这样:
build.xml

<project name="sonar" xmlns:fl="antlib:it.haefelinger.flaka" xmlns:sonar="antlib:org.sonar.ant">
  <fl:install-property-handler/>

  <!-- Import Sonar -->
  <taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml"/>

  <!-- Import XMLTask -->
  <taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask"/>

  <xmltask source="C:/WKS/Eclipse/372/sonar/props.xml">
    <copy path="//project/name/text()" property="projectname"/>
    <copy path="//module/*/label/text()" property="projectlabel"/>
    <copy path="//module/*/name/text()" property="modules" append="true" propertyseparator="," />
  </xmltask>

  <property name="sonar.projectKey" value="${projectname}"/>

  <!-- Set modules IDs -->
  <property name="sonar.modules" value="#{replace('${modules}', '', ' ')}"/>

  <property name="sonar.language" value="java" />
  <property name="sonar.sourceEncoding" value="UTF-8" />
  <property name="sonar.host.url" value="http://somehost:9000" />
  <property name="sonar.login" value="admin" />
  <property name="sonar.password" value="admin" />

  <xmltask source="C:/WKS/Eclipse/372/sonar/props.xml">
    <call path="//module/*">
      <param path="label/text()" name="modullabel"/>
      <param path="name/text()" name="modulname"/>
      <actions>
        <fl:let>
          sonar.projectName ::= replace('@{modulname}', '', ' ')
          sonar.projectVersion ::= '@{modullabel}'
          sonar.#{replace('@{modulname}', '', ' ')}.projectBaseDir ::= '${ant.working.dir}/build/projects/${projectname}/@{modulname}'
          sonar.sources ::=  '${ant.working.dir}/build/projects/${projectname}/@{modulname}/src'
          sonar.binaries ::= '${ant.working.dir}/build/results/compile/${projectname}/@{modulname}'
        </fl:let>
        <!-- Execute Sonar -->
        <sonar:sonar />
      </actions>
    </call>
  </xmltask>
</project>

输出:

Setting project property: modules -> Modul 1,Modul 2,Modul 3,Modul 4
Setting project property: sonar.projectKey -> Foobar
Setting project property: sonar.modules -> Modul1,Modul2,Modul3,Modul4
Setting project property: ant.working.dir -> c:\WKS\5513
Setting project property: sonar.language -> java
Setting project property: sonar.sourceEncoding -> UTF-8
Setting project property: sonar.host.url -> http://somehost:9000
Setting project property: sonar.login -> admin
Setting project property: sonar.password -> admin
Setting project property: sonar.projectName -> Modul1
Setting project property: sonar.projectVersion -> l_5_04_52_cd
Setting project property: sonar.Modul1.projectBaseDir -> c:\WKS\5513/build/projects/foobar/Modul 1
Setting project property: sonar.sources -> c:\WKS\5513/build/projects/foobar/Modul 1/src
Setting project property: sonar.binaries -> c:\WKS\5513/build/results/compile/foobar/Modul 1
parsing buildfile jar:file:/C:/WKS/Eclipse/372/DevJars/sonar/sonar-ant-task-2.1.jar!/org/sonar/ant/antlib.xml with URI = jar:file:/C:/WKS/Eclipse/372/DevJars/sonar/sonar-ant-task-2.1.jar!/org/sonar/ant/antlib.xml from a zip file
Class org.sonar.ant.SonarTask loaded from parent loader (parentFirst)
[sonar:sonar] Apache Ant(TM) version 1.9.1 compiled on May 15 2013
[sonar:sonar] Sonar Ant Task version: 2.1
[sonar:sonar] Loaded from: file:/C:/WKS/Eclipse/372/DevJars/sonar/sonar-ant-task-2.1.jar
[sonar:sonar] INFO: Default locale: "de_DE", source code encoding: "UTF-8"
[sonar:sonar] INFO: Work directory: C:\WKS\sonar
[sonar:sonar] INFO: Sonar Server 3.7.2

BUILD FAILED
C:\WKS\Eclipse\372\sonar\sonar.xml:41: The following error occurred while executing this line:
C:\WKS\Eclipse\372\sonar\sonar.xml:54: org.sonar.runner.impl.RunnerException: Unable to execute Sonar
...
Caused by: java.lang.IllegalStateException: The base directory of the module 'Modul1' does not exist: C:\WKS\Eclipse\372\sonar\Modul 1

我还尝试将 basedir 属性设置为我的 ${ant.working.dir} 的值,所有 binariues 和 src 文件夹都驻留在其中。

【问题讨论】:

    标签: sonarqube


    【解决方案1】:

    【讨论】:

    • 谢谢,已经找到了,但它对我不起作用,请参阅我的答案中的 --EDIT--。
    • 在这种情况下,如果您想在单个配置文件中配置所有内容,您还可以查看以下示例:github.com/SonarSource/sonar-examples/tree/master/projects/…。有基于 SonarRunner 但你可以在 Sonar Ant 任务中做完全相同的事情。
    • 感谢您的提示,已经朝那个方向尝试过,请参阅第二个 -- 编辑 -- 但它不起作用。
    • 两个链接现在都失效了。 :(
    【解决方案2】:

    我遇到了类似的问题。当您从 Eclipse 运行 ant 任务时,不会显示声纳错误。所以,当从命令控制台执行 ant ask 时,我发现了问题。

    我有两个问题:

    1. sonar.host.url 属性是强制性的
    2. sonar.projectKey 不能包含特殊字符,例如空格

    【讨论】:

      猜你喜欢
      • 2018-07-19
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 2021-02-09
      • 2020-04-25
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      相关资源
      最近更新 更多