問題:當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文件";
}
}
如果有你有更好的方式,也請留言告訴我,非常感謝
最後附上我的部署流程圖: