【问题标题】:sonar analysis on maven multimodule project with nonstandard directory structure非标准目录结构的maven多模块项目声纳分析
【发布时间】:2013-07-16 22:19:08
【问题描述】:

我正在尝试 mavenize 一个项目。代码库开始膨胀,需要拆分成多个模块。但是,我们已经有了一些专有的部署过程,并且目录结构不能为了支持 Maven 方式而妥协。

简化结构如下:

  /workspace/basesrc/
                    |_ superpom.xml
                    |_ com/company/parentpkg/
                                          |_ ModuleA/
                                                    |_ pom.xml
                                                    |_SubAModuleA/
                                                                 |_ SubAModuleAClass.java
                                                                 |_ pom.xml
                                                    |_SubAModuleB/
                                                                 |_ SubAModuleBClass.java
                                                                 |_ pom.xml
                                          |_ ModuleB/
                                                    |_ ModuleBClass.java
                                                    |_ pom.xml

我能够使用以下设置构建项目:

方法 A

(superpom.xml):

<build>
  <sourceDirectory>.</sourceDirectory>
</build>

这是由子模块继承的,实际上只构建其当前目录。

但是,如果出现这种情况,Sonar 似乎无法解析软件包名称:mvn sonar:sonar throws exception while doing Java AST scan。

方法 B:指定根源目录并使用 maven 编译器包含,如下所述:http://maven.apache.org/guides/mini/guide-using-one-source-directory.html

(superpom.xml)

<build>
  <sourceDirectory>/workspace/basesrc/</sourceDirectory>
</build>

(SubAModuleA pom.xml)

<build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <includes><include>com/company/parentpkg/ModuleA/SubAModuleA/**/*.java</include></includes>
        </configuration>
      </plugin>
    </plugins>
  </build>

同样,这适用于 Maven 构建的情况。但是,尽管从子模块目录运行 mvn sonar:sonar,Sonar 似乎包含整个 /workspace/basesrc/ 文件夹。

所以我的问题是,

如果我使用方法 A,有没有办法配置/覆盖 Sonar Maven 插件在其中搜索 Java 源文件的根目录属性?它可以与 ${project.build.sourceDirectory} maven 属性不同吗?

使用方法 B,如何将 Sonar 配置为仅分析 maven-compiler-plugin 正在构建的内容?

【问题讨论】:

  • 我认为告诉我们 SubAModuleAClass 有什么包很重要。是 com.company.parentpkg.ModuleA.SubAModuleA 吗?如果是这样,我看不出那里有任何子模块层次结构的原因。只需去 superpom 并在那里进行分析。
  • 嗨彼得,是的,它是 com.company.parentpkg.ModuleA.SubAModuleA。然而,这个包的内容是一个独立的模块。此外,这就是实施多模块项目的重点,对吧?为了能够将源代码库分离为自包含的可重用组件?
  • 好吧,在 maven 中,您的每个子模块都应该包含完整的包层次结构,而不仅仅是一个最终类

标签: maven build sonarqube


【解决方案1】:

对于那些有兴趣的人,只是重申&lt;sonar.includes&gt;必须放在&lt;properties&gt;下而不是&lt;configuration&gt;下&lt;plugin&gt;。而且声纳必须是 3.5 以上版本。

【讨论】:

    【解决方案2】:

    好吧,我认为以下内容应该可以帮助您设置项目:http://maven.apache.org/guides/mini/guide-using-one-source-directory.html

    见章节:

    从单个源目录生成多个唯一 JAR

    请理解,这不是在 maven 中设置的方式,因为您违反了约定,这使得 maven 如此强大。另一方面,我知道在某些项目中,无法将源结构更改为 maven 约定的方式。

    【讨论】:

    • 嗨,彼得,这可能是一个选项,但这对声纳分析与我上面提到的方法 B 没有任何区别。它仍然将整个代码库作为单个项目进行分析。理想的做法是能够有选择地分析子模块,而无需从其他模块中获取所有源代码。
    • 你确定,是一样的吗?我相信您的设置的不同之处在于它们在子模块中使用: ../src/main/java,您这样做了吗?对于您的情况: ../../../../ (如果我正确计算了包裹数:))
    • 我不久前遇到过这个问题,stackoverflow.com/questions/15065400/…。所以我添加了 [在此处插入 maven-compiler-plugin 包含过滤器]。但是,从分析的长度来看,Sonar 似乎仍在关注其他子模块?还是我只是用错了?
    • 我的意思是,它仍然会导致相同的单一源文件夹声纳分析,而不是有选择地分析单独的模块。我说对了吗?
    • 知道了。应作为项目属性,声纳版本必须为 3.5 以上。
    猜你喜欢
    • 2013-03-21
    • 2021-02-23
    • 2016-12-12
    • 2018-06-04
    • 2017-05-09
    • 2015-09-28
    • 1970-01-01
    • 2016-09-19
    • 2023-03-03
    相关资源
    最近更新 更多