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

是否从Maven pom.xml更新sonar-project.properties文件中的特定属性?,maven,spring-boot,sonarqube,Maven,Spring Boot,Sonarqube,我有一个Spring引导应用程序,它使用Maven作为构建和依赖关系管理工具。Maven版本是3.5.0 SonarQube被用来进行静态代码分析。在提交到Git之前,开发人员使用机器上的来扫描项目。詹金斯还使用詹金斯的声纳扫描仪进行自动分析。SonarQube扫描仪需要一个名为sonar project.properties的文件,该文件位于项目的根目录下。上面提到的两个用例使用相同的sonar项目.properties文件 也就是说,我希望在构建过程中使用Maven填充sonar proje

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

SonarQube被用来进行静态代码分析。在提交到Git之前,开发人员使用机器上的来扫描项目。詹金斯还使用詹金斯的声纳扫描仪进行自动分析。SonarQube扫描仪需要一个名为
sonar project.properties
的文件,该文件位于项目的根目录下。上面提到的两个用例使用相同的
sonar项目.properties
文件

也就是说,我希望在构建过程中使用Maven填充sonar project.properties中的一些属性,因此我们不必一直在两个地方更改它们

例如:

  • sonar.projectVersion
    (利用pom.xml中的本机版本属性)
  • sonar.java.source
    (利用pom.xml中的属性)
  • sonar.java.target
    (利用pom.xml中的属性)
可行吗?我刚刚开始使用Maven(来自Ant),在Ant中我可以很容易地做到这一点


谢谢

是的,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>
之后,sonar-project.properties将包含这些行

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

我终于能够使用
maven-antrun插件
满足需求

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

maven antrun插件
声纳性能更换
编译
跑

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

这不是我首选的解决方案,因为我本来希望有一个原生的Maven来完成这个常见的任务,但它工作得非常好


如果有本机方法,请发布您的答案,我会立即接受。

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