当前位置: 首页 > 知识库问答 >
问题:

SonarQube——基于文件系统层次结构的多模块项目

汤英豪
2023-03-14

一些名为Foo的CVS存储库有几个模块,f.e.模块1,模块2
构建脚本执行cvs签出、编译和构建模块。所有模块的jar
构建完成后,html" target="_blank">文件系统看起来是这样的:

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

现在我想像这样使用sonar任务:
定义像sonar这样的全局sonar属性。用户名。。。声纳。projektName=Foo用于主项目和声纳。模块=模块1。模块2,。。。用于模块
然后在模块文件夹上循环,设置模块特定的声纳属性,
如声纳。projectName(用于modulename)声纳。来源,声纳。二进制文件等。
循环工作正常,但sonar似乎只需要一个版本。每个子模块的xml
所以我需要另一种对模块进行分组的可能性<我只找到了一个商业插件=

--编辑--

我已经找到并尝试使用来自github和留档的示例,但是它们似乎需要一个主构建文件和每个模块文件夹中的build.xml。只有一个build.xml包含我项目的每个模块的javac jar目标。当构建完成时,生成的文件系统看起来像上面提到的那样。
构建是部署工作流的一部分,该工作流由xmlProperties文件驱动,其中包含该部署作业的项目名称和所有模组名。
构建后是完成后,在下一个antfile中,我想通过xml任务循环遍历xmlProperties文件中的模块,将模块特定的属性指向文件系统,即sonar.sources=/Foo/module1/srcsonar.binaries=/Foo/module1/bin并调用

<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}的值,所有二进制文件和src文件夹都驻留在这个值上,但也没有起作用。


共有2个答案

衡安晏
2023-03-14

我也有类似的问题。当您从eclipse运行ant任务时,声纳错误不显示。所以,我在命令控制台执行ant ask时找出了问题。

我有两个问题:

  1. sonar.host.url财产是强制性的
  2. sonar.project不能包含特殊字符,例如空格
路奇
2023-03-14

见文件:http://docs.codehaus.org/display/SONAR/Analyzing使用SonarQubeAnt任务#使用SonarQubeantTask多模块项目分析

例如:https://github.com/SonarSource/sonar-examples/tree/master/projects/multi-module/ant

 类似资料:
  • 通过学习《 Linux一切皆文件》一节我们知道,平时打交道的都是文件,那么,应该如何找到它们呢?很简单,在 Linux 操作系统中,所有的文件和目录都被组织成以一个根节点“/”开始的倒置的树状结构,如图 1 所示。 图 1 Linux 系统文件和目录组织示意图 其中,目录就相当于 Windows 中的文件夹,目录中存放的既可以是文件,也可以是其他的子目录,而文件中存储的是真正的信息。 文件系统的最

  • 文件系统通过允许以方便的方式存储,定位和检索数据来提供对磁盘的有效访问。 文件系统必须能够存储文件,找到文件并检索文件。 大多数操作系统对包括文件系统在内的每个任务都使用分层方法。 文件系统的每一层都负责一些活动。 下面显示的图像详细说明了文件系统在不同层中的划分方式,以及每层的功能。 当应用程序要求提供文件时,第一个请求将被引导至逻辑文件系统。 逻辑文件系统包含文件和目录结构的元数据。 如果应用

  • 5.4.1 层次化体系结构 层次化设计是构造复杂系统的一个基本方法,按此方法设计出的系统具有层次化体系结构。现实世界中这种层次化结构俯拾皆是。例如,一幢高楼总是从最底层打基础开始,一层 一层地加高。又如,我国的行政组织具有街道、区、市、省、中央这样的层次化结构。 计算机软件的各个构件也经常组织成这样的层次体系结构。在层次体系中,下层构件为 上层构件提供服务,上层构件使用下层构件的服务,上层和下层之

  • 我们将通过使用 Cargo 创建一个新项目来开始我们的模块之旅,不过这次不再创建一个二进制 crate,而是创建一个库 crate:一个其他人可以作为依赖导入的项目。第二章猜猜看游戏中作为依赖使用的 rand 就是这样的 crate。 我们将创建一个提供一些通用网络功能的项目的骨架结构;我们将专注于模块和函数的组织,而不担心函数体中的具体代码。这个项目叫做 communicator。Cargo 默

  • 问题内容: 是否可以基于层次结构/ cte创建视图? 我看过一个有关如何基于链接递归查询生成结果集的示例。 我已经附上了ddl和声明。 谢谢你, 埃尔默 问题答案: 后已被指定(超出右括号),您需要选择从CTE的所有值: 这是构成视图的实际选择查询。 这是一个完整的工作示例,其中选择了视图的最终输出,以及一些其他语句,以允许这些语句在SQL Server Management Studio中一次执

  • 本文向大家介绍ABP框架的体系结构及模块系统讲解,包括了ABP框架的体系结构及模块系统讲解的使用技巧和注意事项,需要的朋友参考一下 DDD分层 为了减少复杂性和提高代码的可重用性,采用分层架构是一种被广泛接受的技术。 为了实现分层的体系结构,ABP遵循DDD(领域驱动设计)的原则,将分为四个层次: 展现层(Presentation):提供一个用户界面,实现用户交互操作。 应用层(Applicati