概述

在这个教程中,我们将展示如何将Git仓库信息注入到基于Maven构建的Spring Boot应用中。为此,我们将使用maven-git-commit-id-plugin,这是一个专为此目的设计的便捷工具。

2. Maven依赖

在我们的项目pom.xml文件的<plugins>部分添加一个插件:

<plugin>
    <groupId>pl.project13.maven</groupId>
    <artifactId>git-commit-id-plugin</artifactId>
    <version>2.2.1</version>
</plugin>

你可以在这里找到最新版本:mavenrepository.com/artifact/pl.project13.maven/git-commit-id-plugin。请注意,这个插件需要至少3.1.1版本的Maven。

注意,该插件有一个更晚的重定位版本(5.x或更高版本),可以在不同的存储坐标下使用。然而,这些版本需要Java 11。由于我们将使用Spring Boot 2.x构建示例应用,其基础是Java 8,因此我们需要使用旧版本的插件以保持与Spring Boot的兼容性。

3. 配置

这个插件有许多方便的标志和属性,可以扩展其功能。在本节中,我们将简要描述其中一些。如需了解所有选项,请访问maven-git-commit-id-plugin的页面,如果直接想看例子,请跳至第4节。

以下片段包含插件属性的例子;根据需要在<configuration></configuration>部分进行配置。

3.1. 忽略未找到的仓库

可以配置它在未找到Git仓库时忽略错误:

<failOnNoGitDirectory>false</failOnNoGitDirectory>

3.2. Git仓库位置

若要指定自定义的.git仓库位置,请使用dotGitDirectory属性:

<dotGitDirectory>${project.basedir}/submodule_directory/.git</dotGitDirectory>

3.3. 输出文件

为了生成具有自定义名称和/或目录的属性文件,使用以下部分:

<generateGitPropertiesFilename>
    ${project.build.outputDirectory}/filename.properties
</generateGitPropertiesFilename>

3.4. 日志级别

要获得更多详细日志,请使用:

<verbose>true</verbose>

3.5. 属性文件生成

可以关闭生成git.properties文件:

<generateGitPropertiesFile>false</generateGitPropertiesFile>

3.6. 属性前缀

若要指定自定义属性前缀,请使用:

<prefix>git</prefix>

3.7. 只针对父仓库

在处理带有子模块的项目时,设置此标志可确保插件仅针对父仓库工作:

<runOnlyOnce>true</runOnlyOnce>

3.8. 属性排除

你可能希望排除一些敏感数据,如仓库用户信息:

<excludeProperties>
    <excludeProperty>git.user.*</excludeProperty>
</excludeProperties>

3.9. 属性包含

只包含指定的数据也是可能的:

<includeOnlyProperties>    
    <includeOnlyProperty>git.commit.id</includeOnlyProperty>
</includeOnlyProperties>

4. 示例应用

现在,让我们创建一个简单的REST控制器,它将返回有关我们项目的基本信息。

我们将使用Spring Boot创建示例应用。如果你还不知道如何设置Spring Boot应用,请参考入门文章:配置Spring Boot Web应用

我们的应用将由两个类组成:ApplicationCommitIdController

4.1. Application

CommitIdApplication将是我们的应用的根:

@SpringBootApplication(scanBasePackages = { "com.baeldung.git" })
public class CommitIdApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(CommitIdApplication.class, args);
    }
 
    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
        PropertySourcesPlaceholderConfigurer propsConfig 
          = new PropertySourcesPlaceholderConfigurer();
        propsConfig.setLocation(new ClassPathResource("git.properties"));
        propsConfig.setIgnoreResourceNotFound(true);
        propsConfig.setIgnoreUnresolvablePlaceholders(true);
        return propsConfig;
    }
}

除了配置应用的根,我们还创建了一个PropertyPlaceHolderConfigurer bean,以便能够访问由插件生成的属性文件。

我们还设置了一些标志,即使Spring无法解析git.properties文件,应用也能顺利运行。

4.2. 控制器

@RestController
public class CommitInfoController {

    @Value("${git.commit.message.short}")
    private String commitMessage;

    @Value("${git.branch}")
    private String branch;

    @Value("${git.commit.id}")
    private String commitId;

    @RequestMapping("/commitId")
    public Map<String, String> getCommitId() {
        Map<String, String> result = new HashMap<>();
        result.put("Commit message",commitMessage);
        result.put("Commit branch", branch);
        result.put("Commit id", commitId);
        return result;
    }
}

如你所见,我们正在将Git属性注入类字段中。

要查看所有可用的属性,请参阅git.properties文件或作者的GitHub 页面。我们还创建了一个简单的端点,当收到HTTP GET请求时,它将响应包含注入值的JSON。

4.3. Maven入口

首先,设置插件执行步骤以及其他我们认为有用的任何其他配置属性:

<plugin>
    <groupId>pl.project13.maven</groupId>
    <artifactId>git-commit-id-plugin</artifactId>
    <version>2.2.1</version>
    <executions>
        <execution>
            <id>get-the-git-infos</id>
            <goals>
                <goal>revision</goal>
            </goals>
        </execution>
        <execution>
            <id>validate-the-git-infos</id>
            <goals>
                <goal>validateRevision</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <!-- ... -->
    </configuration>
</plugin>

为了让代码正常工作,我们需要在类路径中有一个git.properties文件。有以下两种方法实现。

第一种方法是让插件自动生成文件。通过将generateGitPropertiesFile配置属性设置为true,我们可以指定这一点:

<configuration>
    <generateGitPropertiesFile>true</generateGitPropertiesFile>
</configuration>

第二种方法是在资源文件夹中包含一个git.properties文件。我们可以只包含项目中将使用的条目:

# git.properties
git.tags=${git.tags}
git.branch=${git.branch}
git.dirty=${git.dirty}
git.remote.origin.url=${git.remote.origin.url}
git.commit.id=${git.commit.id}
git.commit.id.abbrev=${git.commit.id.abbrev}
git.commit.id.describe=${git.commit.id.describe}
git.commit.id.describe-short=${git.commit.id.describe-short}
git.commit.user.name=${git.commit.user.name}
git.commit.user.email=${git.commit.user.email}
git.commit.message.full=${git.commit.message.full}
git.commit.message.short=${git.commit.message.short}
git.commit.time=${git.commit.time}
git.closest.tag.name=${git.closest.tag.name}
git.closest.tag.commit.count=${git.closest.tag.commit.count}
git.build.user.name=${git.build.user.name}
git.build.user.email=${git.build.user.email}
git.build.time=${git.build.time}
git.build.host=${git.build.host}
git.build.version=${git.build.version}

Maven将替换占位符为适当的值。

注意:一些IDE可能不适用于此插件,并且在我们如上定义属性时可能会抛出“循环占位符引用”错误。

启动应用并请求localhost:8080/commitId,你会看到类似以下结构的JSON文件:

{
    "Commit id":"7adb64f1800f8a84c35fef9e5d15c10ab8ecffa6",
    "Commit branch":"commit_id_plugin",
    "Commit message":"Merge branch 'master' into commit_id_plugin"
}

5. 与Spring Boot Actuator的集成

你可以轻松地与Spring Boot Actuator集成。

如文档所述(Spring Boot Actuator文档),如果存在,GitInfoContributor会自动获取git.properties文件。因此,使用默认的插件配置,调用/info端点时将返回Git信息:

{
  "git": {
    "branch": "commit_id_plugin",
    "commit": {
      "id": "7adb64f",
      "time": "2016-08-17T19:30:34+0200"
    }
  }
}

6. 总结

在这篇教程中,我们展示了如何使用maven-git-commit-id-plugin,并创建了一个简单的Spring Boot应用,该应用利用插件生成的属性。

演示的配置并未涵盖所有可用标志和属性,但涵盖了与这个插件开始工作的基本知识。

你可以在GitHub上找到代码示例。