MANIFEST.MF用jar命令打包后格式混乱

我们平时在打jar包时会需要指定当前jar包的依赖jar包,那么我们就要在MANIFEST.MF文件的Class-Path中来声明这些包,通常可以直接手工修改jar包中的MANIFEST.MF文件,在别的jar包里如果也需要这个MANIFEST.MF文件,我们可以直接copy过去,也是可以使用的。

 

但是如果是用jar命令打包,指定这个手工修改得MANIFEST.MF文件,jar命令就会根据MANIFEST.MF的定义格式来重新排列MANIFEST.MF文件中的信息,造成格式混乱,有的依赖jar包在MANIFEST.MF文件有声明但是使用时仍然找不到。


我们可以利用java提供的java.util.jar.Manifest类来处理,这样可以不用考虑MANIFEST.MF的文件格式,Manifest类可以帮助我们处理,用jar命令指定MANIFEST.MF文件时也不会发生格式改变的问题

 

提供个我写的Manifest类得使用方法

 

package com.egi.core.util;

import java.io.File;
import java.io.FileOutputStream;
import java.util.jar.Attributes;
import java.util.jar.Manifest;

public class ManifestUtil {

	public static void create(String filePath, String classDir)
			throws Exception {
		File mfFile = new File(filePath);
		if (!mfFile.exists()) {
			mfFile.createNewFile();
		}
		FileOutputStream fos = new FileOutputStream(mfFile);
		StringBuffer sb = new StringBuffer();
		File classFile = new File(classDir);
		int count = 0;
		if (classFile.exists()) {
			if (classFile.isDirectory()) {
				File[] files = classFile.listFiles();
				for (int i = 0; i < files.length; i++) {
					if (files[i].getName().endsWith(".jar")) {
						count++;
						sb.append(files[i].getName()).append(" ");
					}
				}
			}
		}
		System.out.println("There are " + count + " jar files!");
		System.out.println(sb.toString());
		Manifest m = new Manifest();
		Attributes a = m.getMainAttributes();
		a.put(Attributes.Name.MANIFEST_VERSION, "1.0");
		a.put(Attributes.Name.CLASS_PATH, sb.toString());
		System.out.println("a.getValue =---------="
				+ a.getValue(Attributes.Name.CLASS_PATH));
		System.out.println(a.getValue(Attributes.Name.CLASS_PATH).length());
		m.write(fos);
		fos.flush();
		fos.close();

	}
}

 

你可能感兴趣的:(java)