Springboot查看MANIFEST.MF信息

問題:當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")
    @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+"<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文件";

    }

}

如果有你有更好的方式,也請留言告訴我,非常感謝

最後附上我的部署流程圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章