【问题标题】:Update specific properties in sonar-project.properties file from Maven pom.xml?从 Maven pom.xml 更新 sonar-project.properties 文件中的特定属性?
【发布时间】:2018-06-04 10:50:07
【问题描述】:

我有一个使用 Maven 作为构建和依赖管理工具的 Spring Boot 应用程序。 Maven 版本是 3.5.0。

SonarQube 被用于进行静态代码分析。开发人员在提交到 Git 之前使用他们机器上的SonarQube scanner 来扫描项目。 Jenkins 还使用 Sonar Scanner for Jenkins 运行自动化分析。 SonarQube 扫描器需要一个名为 sonar-project.properties 的文件,该文件位于项目的根目录中。上面提到的两个用例都使用相同的sonar-project.properties 文件。

话虽如此,我希望在构建期间由 Maven 填充来自 sonar-project.properties 的一些属性,因此我们不必一直在两个地方更改它们。

一些例子是:

  • sonar.projectVersion(利用 pom.xml 中的原生版本属性)
  • sonar.java.source(利用我在 pom.xml 中的属性)
  • sonar.java.target(利用我在 pom.xml 中的属性)

可行吗?我刚开始使用 Maven(来自 Ant),我可以很容易地在 Ant 中做到这一点。

谢谢

【问题讨论】:

    标签: maven spring-boot sonarqube


    【解决方案1】:

    是的,Maven 具有在构建期间用属性替换占位符的功能。它被称为过滤。根据您的用例,您可能需要将以下内容添加到您的 pom.xml

    <resources>
      <resource>
        <directory>${project.basedir}</directory>
        <includes>
          <!-- To replace placeholders in sonar-project.properties -->
          <include>sonar-project.properties</include>
        </includes>
        <filtering>true</filtering>
      </resource>
      <resource>
        <!-- To process default resources located in src/main/resources folder of your project-->
        <directory>${project.basedir}/src/main/resources</directory>
        <includes>
          <include>*.*</include>
        </includes>
        <filtering>true</filtering>
      </resource>
    </resources>
    

    Maven 具有预定义的项目版本属性,占位符 ${project.version} 对于 java 版本,您需要像这样向 pom.xml 添加自定义属性

    <properties>
       <java.source.version>1.7</java.source.version>
       <java.target.version>1.7</java.target.version>
    </properties>
    

    然后你的 sonar-project.properties 将包含这些行

    sonar.projectVersion=${project.version}
    sonar.java.source=${java.source.version}
    sonar.java.target=${java.target.version}
    

    【讨论】:

    • 是否应该将 ${project.version} 的值替换为 pom.xml 中的值(例如 1.0.0.RELEASE)?我正在使用通用声纳扫描仪,它与 Maven 没有紧密耦合。我想要的是一种在 sonar-project.properties 中为特定属性设置值的方法,而不仅仅是在 sonar-project.properties 和 pom.xml 之间建立一个符号链接。可行吗?
    • 是的,它将从 pom.xml 中获取所有属性的值,包括版本 (1.0.0.RELEASE)。我认为您正在运行 Sonar Scanner 作为 Maven 构建的一部分
    • 我是,但我改变了主意,决定使用通用声纳扫描仪。就我而言,当我做mvn clean compile 时,值没有按预期更新。例如,我看到:sonar.projectName=${project.name}sonar.projectVersion=${project.version}sonar.java.source=${java.version}sonar.java.target=${java.version}。我错过了什么吗?也许有些处决?
    • 带替换的文件位于包含已编译类(如目标/类)的文件夹中。 Maven 不会在源文件本身中进行替换。
    • Maven 有很多插件。但这个想法是你使用 Maven 做所有事情:第一步编译 java 代码并替换占位符,第二步执行单元测试,第三步启动 sonar-scanner(或为 Sonar 使用 Maven 插件),第四步将代码打包到 jar/war /zip,第五步将工件部署到二进制存储库。
    【解决方案2】:

    我终于可以使用maven-antrun-plugin满足要求了。

    <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
            <execution>
                <id>sonar-properties-replacement</id>
                <phase>compile</phase>
                <configuration>
                    <target>
                        <propertyfile file="${basedir}/sonar-project.properties">
                            <entry key="sonar.projectName" value="${project.name}" />
                            <entry key="sonar.projectKey" value="${sonar.projectKey}" />
                            <entry key="sonar.projectVersion" value="${project.version}" />
                            <entry key="sonar.java.source" value="${java.version}" />
                            <entry key="sonar.java.target" value="${java.version}" />
                        </propertyfile>
                        <replaceregexp file="${basedir}/sonar-project.properties" match="^#.*\n" replace=""/>
                    </target>
                </configuration>
                <goals>
                    <goal>run</goal>
                </goals>
            </execution>
        </executions>
    

    令牌实际上是定义在 pom.xml 开头的属性(java.version 和 sonar.projectKey),以及项目名称和版本的 Maven 原生属性。

    这不是我的首选解决方案,因为我希望本地 Maven 可以完成这项常见任务,但效果很好。

    如果有本地方法可以做到这一点,请发布您的答案,我会立即接受。

    【讨论】:

      猜你喜欢
      • 2021-08-19
      • 2013-09-05
      • 1970-01-01
      • 2014-02-20
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      相关资源
      最近更新 更多