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();}}?