Lấy thông tin version của ứng dụng từ tập tin META-INF/MANIFEST.MF bên trong tập tin jar

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Một nhu cầu mà chúng ta thường gặp là làm sao để biết được ứng dụng mà chúng ta đang chạy có version là bao nhiêu, giúp chúng ta có thể biết được những feature mà ứng dụng đang hỗ trợ cho tới version này. Trong Java thì tuỳ theo ứng dụng mà các bạn đang sử dụng là gì, Web application hay Desktop application thì cách lấy thông tin version của ứng dụng sẽ khác nhau. Đối với các ứng dụng Java Desktop hoặc Java Console, các bạn có thể lưu trữ và lấy thông tin version của ứng dụng từ tập tin META-INF/MANIFEST.MF bên trong tập tin jar của ứng dụng.

  Hướng dẫn cài đặt và cấu hình để dùng nhiều version PHP (Multiple versions PHP)
  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java

Xem thêm các việc làm Java lương cao trên TopDev

Ví dụ như mình có một ứng dụng Java Console khi chạy sẽ in ra dòng chữ “Hello from Huong Dan Java”:

Lấy thông tin version của ứng dụng từ tập tin META-INF/MANIFEST.MF bên trong tập tin jar

Mình đã sử dụng Maven Shade Plugin để build ứng dụng này, và khi build ứng dụng, mình đã thêm một số thông tin liên quan đến ứng dụng vào tập tin META-INF/MANIFEST.MF bên trong tập tin jar như sau:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven 3.6.3
Built-By: khanh
Build-Jdk: 15.0.1
Main-Class: com.huongdanjava.mavenshadeplugin.Application
Implementation-Title: maven-shade-plugin-example
Implementation-Vendor-Id: com.huongdanjava
Implementation-Version: 0.0.1-SNAPSHOT
Specification-Title: maven-shade-plugin-example
Specification-Version: 0.0.1-SNAPSHOT

Trong những thông tin này thì thông tin header “Implementation-Version” chứa thông tin về version của ứng dụng.

Để lấy thông tin này và hiển thị ra cho ứng dụng, các bạn có thể sử dụng đoạn code sau:

public String getVersion() throws IOException {
URLClassLoader cl = (URLClassLoader) Application.class.getClassLoader();
URL url = cl.findResource("META-INF/MANIFEST.MF");
Manifest manifest = new Manifest(url.openStream());
Attributes attr = manifest.getMainAttributes();

return attr.getValue("Implementation-Version");
}

với class Application là một class bất kỳ của ứng dụng.

Ví dụ của mình như sau:

package com.huongdanjava.mavenshadeplugin;

import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.jar.Attributes;
import java.util.jar.Manifest;

import org.apache.commons.lang3.StringUtils;

public class Application {

public static void main(String[] args) throws IOException {
String version = getVersion();

System.out.println(StringUtils
.capitalize("hello from Huong Dan Java. Application version is " + version));
}

private static String getVersion() throws IOException {
URLClassLoader cl = (URLClassLoader) Application.class.getClassLoader();
URL url = cl.findResource("META-INF/MANIFEST.MF");
Manifest manifest = new Manifest(url.openStream());
Attributes attr = manifest.getMainAttributes();

return attr.getValue("Implementation-Version");
}
}

thì khi build lại ứng dụng rồi chạy nó, các bạn sẽ thấy kết quả như sau:

Lấy thông tin version của ứng dụng từ tập tin META-INF/MANIFEST.MF bên trong tập tin jar