Springboot查看MANIFEST.MF信息

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

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

解决办法:

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

效果:

步骤:

1、pom.xml配置 时间戳

4.0.0
zzf-system
系统管理app接口
 jar
${maven.build.timestamp}

1.0.5
yyyy-MM-dd HH:mm:ss

2、打包配置 

 
        ${project.name}
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
            
        
    

3、Controller类


/**
 *
 * @author zzf
 * 欢迎入Q群45155962一起交流
 * @version 1.00.00
 */
@Controller
@RequestMapping("/")
public class IndexController {

    /***
     * 读取 META-INF/MANIFEST.MF
     * 主要查看jar构建时间,判断该当前运行jar是否最新
     * @return
     */
    @RequestMapping("/jarinfo")
    @ResponseBody
    public  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.MF
            jarFile = new JarFile(jarFilePath);
            JarEntry entry = jarFile.getJarEntry("META-INF/MANIFEST.MF");
            // 如果读取到MANIFEST.MF文件内容,则转换为string
            if (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+"
"); } 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张图片

你可能感兴趣的:(spring,boot,docker)