问题:当jar应用部署在服务器上后,因为是用docker容器来运行, 有一烦恼不知道代码是不是最新,该容器启动的是不是从最新的镜像启动的。

网上很多解决办法是 jar的命名加时间戳,但这会有几个问题,1、就是打包镜像时,每次都要修改这个jar包名,比较麻烦;2、在测试环镜、生产环境运行起来后也是不知道是否是最新的包。

解决办法:

maven 打包时加入时间戳写入MANIFEST.MF,在 controller 读取MANIFEST.MF,查看时间戳 即可判断是否最新的

效果:

步骤:

1、pom.xml配置 时间戳

<modelVersion>4.0.0</modelVersion>
<artifactId>zzf-system</artifactId>
<description>系统管理app接口</description><packaging>jar</packaging>
<version>${maven.build.timestamp}</version>
<properties>
<maven.build.number>1.0.5</maven.build.number>
<maven.build.timestamp.format>yyyy-MM-dd HH:mm:ss</maven.build.timestamp.format>
</properties>

2、打包配置

 <build><finalName>${project.name}</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugin></plugins></build>

3、Controller类


/**** @author zzf* 欢迎入Q群45155962一起交流* @version 1.00.00*/
@Controller
@RequestMapping("/")
public class IndexController {/**** 读取 META-INF/MANIFEST.MF* 主要查看jar构建时间,判断该当前运行jar是否最新* @return*/@RequestMapping("/jarinfo")@ResponseBodypublic  String jarinfo() {return JarFileUtils.readJarFile();}}

4、读取MANIFEST.MF


import org.springframework.util.ClassUtils;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;/**** @author zzf* 欢迎入Q群45155962一起交流* @version 1.00.00*/
public class JarFileUtils {public static String readJarFile() {JarFile jarFile = null;BufferedReader br = null;try {// 获取jar的运行路径,因linux下jar的路径为”file:/app/.../test.jar!/BOOT-INF/class!/“这种格式,所以需要去掉”file:“和”!/BOOT-INF/class!/“String jarFilePath = ClassUtils.getDefaultClassLoader().getResource("").getPath().replace("!/BOOT-INF/classes!/", "");if (jarFilePath.startsWith("file")) {jarFilePath = jarFilePath.substring(5);}System.out.println("jarFilePath:" + jarFilePath);// 通过JarFile的getJarEntry方法读取META-INF/MANIFEST.MFjarFile = new JarFile(jarFilePath);JarEntry entry = jarFile.getJarEntry("META-INF/MANIFEST.MF");// 如果读取到MANIFEST.MF文件内容,则转换为stringif (entry != null) {InputStream in =  jarFile.getInputStream(entry);StringBuilder sb = new StringBuilder();br = new BufferedReader(new InputStreamReader(in));String line = "";while ((line = br.readLine()) != null) {sb.append(line+"<br>");}return sb.toString();}} catch (Exception ex) {ex.printStackTrace();} finally {try {if(null != br){br.close();}if(null != jarFile){jarFile.close();}} catch (IOException e) {e.printStackTrace();}}return  "未找到MANIFEST.MF文件";}}

如果有你有更好的方式,也请留言告诉我,非常感谢

最后附上我的部署流程图:

Springboot查看MANIFEST.MF信息相关推荐

  1. MANIFEST.MF文件全面解析

    (一)简介 当我们用Jar命令打完包后,会在根目录下面创建META-INF目录,该目录下面会有一些对该Jar包信息的描述,其中肯定会有一个MANIFEST.MF文件,该文件包含了该Jar包的版本.创建 ...

  2. manifest.mf 详解

    MANIFEST.MF文件全面解析 MANIFEST.MF JAR Main-Class Class-Path JarFile (一)简介 当我们用Jar命令打完包后,会在根目录下面创建META-IN ...

  3. java原生和SpringBoot读取jar包中MANIFEST.MF的方式

    我们经常看到java的一些jar包META-INF目录下包含一个MANIFEST.MF文件,里面包含一些版本信息,标题,实现组织,很多第三方的jar包还会自定义一个属性. 本文讲解如何读取jar包中M ...

  4. java jar包中MANIFEST.MF中有版本信息

    有时候查看人家的源代码,但有可能该软件有很多个版本,这个时候就可以通过 MANIFEST.MF来查看当前项目引用的是哪个版本.当然了如果本身jar包名已经是用版本号来命名的.则不需要这样查看. 可以参 ...

  5. Springboot读取jar包中的MANIFEST.MF文件内容

    Springboot打包成可执行jar包后,包结构如下所示: 工程编译后的文件都在BOOT-INF/classes目录下,如果需要读取并显示META-INF/MANIFEST.MF文件内容,那么可以用 ...

  6. springboot查看请求ip、ip归属地、设备信息、本地MAC地址、操作系统信息

    springboot查看请求ip.ip归属地.设备信息.操作系统信息 1.在pom添加依赖 <dependency><groupId>eu.bitwalker</grou ...

  7. Android APK 签名文件MANIFEST.MF、CERT.SF、CERT.RSA分析

    首先我们找一个已经签名的apk文件,修改后缀名为zip,然后解压.可以看到里面有一个META-INF文件夹,里面就是签名验证的文件.有三个文件MANIFEST.MF.CERT.SF.CERT.RSA分 ...

  8. 【Java】MANIFEST.MF是什么

    1.概述 常常在网上看到有人询问:如何把 java 程序编译成 .exe 文件.通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像.chm 文档一样双击运行了:而另一种是使用 JE ...

  9. MANIFEST.MF

    对模块和元数据进行打包 我们这个模块系统需要一种方法来对模块的内容以及描述导入和导出的元数据进行打包,将其包括到一个可部署的单元中. Java 已经有了标准的部署单元:JAR 文件.JAR 文件可能并 ...

最新文章

  1. html5手机端设置date,如何在移动端更好地使用HTML5 date input
  2. linux系统内核流转浅析
  3. 阿里云服务器如何安装memcached
  4. NiftyNet开源平台使用
  5. c语言一元二次方程 ii(分支嵌套),C程序设计——求一元二次方程算法
  6. python目标识别代码_利用ImageAI库只需几行python代码超简实现目标检测
  7. C++ primer 第10章 泛型算法
  8. LeetCode 2097. 合法重新排列数对(欧拉路径)
  9. python函数内的作用域包括什么_python菜鸟求问关于嵌套函数中作用域范围应该怎么理解?...
  10. 【JavaScript】鼠标单击核心价值观和线条变换实现
  11. 5G 消息绝地求生:盘活短信 VS 击垮微信?
  12. 《UTF-8与GB2312之间的互换》的改进
  13. 《一》Android 数据库 SQlite SQLiteOpenHelper
  14. 惠普打印机驱动服务器系统,在打印机服务器(系统WIN2003)上安装了HP5100 打印机,客户机系统WIN7 64位,现没法添加HP5100的驱动...
  15. C语言编程鲍威尔算法,鲍威尔法编程-powell法编程-c语言编程-c++6.0.doc
  16. 服务器Ubuntu 16.04 更新NVIDIA显卡驱动-命令行版本及报错完美解决
  17. 菊花是哪个城市的市花1_2.html,菊花的季节作文
  18. 特效开发阶段:bootstrap+react小节
  19. 代码规范 : 关于注释和日志
  20. ES 搜索19 (match 查询时权重提升)

热门文章

  1. 粗糙集理解之二:属性约简
  2. 平台如何接入微信支付
  3. element 验证出现英文_vue.js+element 默认提示中英文操作
  4. STM32F103在STM32CubeMX下的应用
  5. Redis基础知识笔记
  6. 程序 多核优化 linux,linux 多核CPU性能调优
  7. 使用word完成海报制作说明书
  8. 女生适合编程吗,有没有编程很厉害的女生?
  9. Quick Viewer 快速浏览器
  10. 搞 Java 的年薪 40W 是什么水平?