从Maven pom.xml更新sonar-project.properties文件中的特定属性?

时间:2017-12-21 18:03:12

标签: maven spring-boot sonarqube

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

SonarQube正用于进行静态代码分析。在提交给Git之前,开发人员使用他们机器上的SonarQube scanner来扫描项目。 Jenkins还使用Sonars 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中做到这一点。

谢谢

2 个答案:

答案 0 :(得分:2)

是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}

答案 1 :(得分:1)

我终于能够使用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能够完成这项常规任务,但效果非常好。

如果有本地方式,请发布您的回答,我会马上接受。