概述
在这个教程中,我们将展示如何将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应用。
我们的应用将由两个类组成:Application
和CommitIdController
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上找到代码示例。