MANIFEST.MF属性读写

MANIFEST.MF属性读写

本案例完整演示项目

一、maven打包写入MANIFEST.MF属性

本案例采用maven写入,可以采用其他工具写入

在pom.xml文件添加打包插件,早manifestEntries标签中添加自定标签和值

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-jar-plugin</artifactId>
	<version>2.3.1</version>
	<configuration>
		<archive>
			<manifestEntries>
				<projectName>
					项目名称
				</projectName>
				<version>
					v1.0
				</version>
			</manifestEntries>
		</archive>
	</configuration>
</plugin>

使用maven打包后获取xxxx.jar文件,打包后MANIFEST.MF新增的属性值

二、Java读取MANIFEST.MF属性值

获取当前jar中MANIFEST.MF文件的属性值,本案例仅提供读取工具类,通过io流获取字符串,获取字符串后解析得到配置。

import org.springframework.util.ClassUtils;
import org.springframework.util.FileCopyUtils;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

/**
 * Manifest 文件操作工具.
 */
public class ManifestUtil {

    /**
     * 获取Manifest文件配置属性值
     *
     * @return
     * @throws IOException
     */
    public static Map<String, String> getManifestProperty() {
        Map<String, String> property = new HashMap<>();
        JarFile jarFile = null;
        String content = "";
        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);
            }
            // 通过JarFile的getJarEntry方法读取META-INF/MANIFEST.MF
            jarFile = new JarFile(jarFilePath);
            JarEntry entry = jarFile.getJarEntry("META-INF/MANIFEST.MF");
            // 如果读取到MANIFEST.MF文件内容,则转换为string
            if (entry != null) {
                StringWriter writer = new StringWriter();
                FileCopyUtils.copy(new InputStreamReader(jarFile.getInputStream(entry), "utf-8"), writer);
                jarFile.close();
                content = writer.toString();
            } else {
                return property;
            }
        } catch (Exception ex) {
            return property;
        } finally {
            try {
                if (jarFile != null) {
                    jarFile.close();
                }
            } catch (IOException e) {
                return property;
            }
        }
        return getProperty(content);
    }

    /**
     * 通过字符解析,MANIFEST.MF 文件中的属性值
     *
     * @param content MANIFEST.MF 文件中的字符串
     * @return
     */
    private static Map<String, String> getProperty(String content) {
        Map<String, String> result = new HashMap<>();
        if ("".equals(content.trim())) {
            return result;
        }
        String[] propertys = content.split("\n");
        if (propertys == null || propertys.length == 0) {
            return result;
        }
        String[] temp;
        try {
            for (int i = 0; i < propertys.length; i++) {
                temp = propertys[i].split(":");
                if (temp.length == 2) {
                    result.put(temp[0].trim(), temp[1].trim());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}

三、功能测试

通过 java -jar   xxx.jar 命令执行jar包,输出配置项数据。只有打包后才会生成MANIFEST.MF文件,所有在项目中无法测试