欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解SpringBoot获得Maven-pom中版本号和编译时间戳

程序员文章站 2022-06-12 11:06:13
这篇文章首先介绍了在springboot中如何获得项目的编译时间和版本号,并向外提供接口,然后介绍了介绍了新版maven获得时间戳时区错误的解决方案,最后介绍了把时间戳加到包名的两种方...

这篇文章首先介绍了在springboot中如何获得项目的编译时间和版本号,并向外提供接口,然后介绍了介绍了新版maven获得时间戳时区错误的解决方案,最后介绍了把时间戳加到包名的两种方法。

springboot项目获得编译时间戳和版本号,然后提供接口大概分为以下步骤:

  • 在pom文件中获取maven的编译时间戳
  • 配置pom,用maven中的属性渲染资源文件application.yml
  • 提供接口

maven中获得编译时间

在 pom文件properties 中添加两个属性

<properties>
 <!--maven.build.timestamp保存了maven编译时间戳-->
 <timestamp>${maven.build.timestamp}</timestamp>
 <!--指定时间格式--> 
 <maven.build.timestamp.format>yyyy-mm-dd hh:mm:ss</maven.build.timestamp.format>
</properties>

用maven属性渲染application.yml

在pom文件build中配置

<build>
 <resources>
  <resource>
   <directory>src/main/resources</directory>
   <filtering>true</filtering>
  </resource>
 </resources>
</build>

在application.yml中配置

不能使用${}

app:
 version: @project.version@
 build:
 time: @timestamp@

提供接口

创建appcontroller,提供接口 get /app

package cn.yshow.modules.sys.controller;

import cn.yshow.common.utils.restresult.restresult;
import cn.yshow.common.utils.restresult.resultgenerator;
import lombok.extern.slf4j.slf4j;
import org.springframework.beans.factory.annotation.value;
import org.springframework.web.bind.annotation.getmapping;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.restcontroller;

import java.util.hashmap;
import java.util.map;

/**
 * @author zhaod zhaodongxx@outlook.com
 * @version v1.0
 * @since 2018/12/16 16:19
 */
@slf4j
@restcontroller
@requestmapping("/app")
public class appcontroller {
 /**
  * 当前版本
  */
 @value("${app.version}")
 private string version;
 /**
  * 打包时间
  */
 @value("${app.build.time}")
 private string buildtime;

 @getmapping
 public restresult uploadimg() {
  map<string,string> ret = new hashmap<>();
  ret.put("version",version);
  ret.put("buildtime",buildtime);
  
  //restresult是我封装的返回对象
  return resultgenerator.gensuccessresult(ret);
 }
}

测试

用yapi测试如下

详解SpringBoot获得Maven-pom中版本号和编译时间戳

maven.build.timestamp时区错误解决方案

在maven 3.2.2+中, maven.build.timestamp已被重新定义,显示utc中的时间,比中国时间慢8个小时。可以使用插件build-helper-maven-plugin获得本时区的时间

在plugins块添加插件,这个配置与官网不一样,按照官网的配置方式会报错

<project>
 <build>
  <!--指定包名 -->
  <finalname>
   ${project.artifactid}-${project.version}-${build.time}
  </finalname>
  <plugins>
   <plugin>
    <groupid>org.codehaus.mojo</groupid>
    <artifactid>build-helper-maven-plugin</artifactid>
    <version>1.8</version>
    <executions>
     <execution>
      <id>timestamp-property</id>
      <goals>
       <goal>timestamp-property</goal>
      </goals>
     </execution>
    </executions>
    <configuration>
     <name>build.time</name>
     <pattern>yyyy-mm-dd hh:mm</pattern>
     <timezone>gmt+8</timezone>
    </configuration>
   </plugin>
  </plugins>
 </build>
</project> 

经过上述处理后,属性${build.time}已经代表gmt-8时区的时间

application.yml配置如下

app:
 version: @project.version@
 build:
 time: @build.time@

idea 编译项目不会调用 maven 生命周期,导致安装的 plugin 不被执行。虽然 maven 自带变量可以被替换,但是自定义变量却不会被替换。

可以将 idea 的 build 与 maven goal 绑定起来,在 build 之前执行 maven goal,idea 右侧 maven projects -> lifecycle -> compile 勾选 execute after build和execute after rebuild ,如下图

详解SpringBoot获得Maven-pom中版本号和编译时间戳

把时间戳加到包名

两种方法不要重复,否则

方法一:把时间戳加到版本号

<project>
 <versioin>
  0.0.5.${build.time}
 </version>
</project>

方法二:把时间戳直接加到包名

<project>
 <build>
  <finalname>
   ${project.artifactid}-${project.version}-${build.time}
  </finalname>
 </build> 
 
</project>

参考资料


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。