继续求教,写java程序打jar包问题
通常我们把.class文件打包,一般手动把bin下的打成zip形式,然后该文件名为*.jar。大家有没有想过写个程序打jar包呢??
最近我的工程需要这样做,我写了一段程序,用代码打jar包,打包的结果跟手动打jar包后的样子是一模一样的,就是文件大小不一样,手动要大一点,自动的要小一点。
jar包里面什么东西都一样。
但是诡异的问题出现了,在我的工程中,在运行是要用到这个jar包,但是类加载器却加载不到jar包里面的.class文件,如果手动打包扔进去,就可以加载。
我和郁闷,折磨我好几天了,希望借助这个平台,能够得到大家的帮助。谢谢。
前面java2000_net 已经提出了一些问题,感谢他,但是好像还不行。
我的和java2000_net 代码如下:
/**
* 功能:文件夹的压缩打包(jar)
*
* @param inputFileName
* 被压缩或者打包的文件夹 outputFileName 压缩后或者打包的文件
*/
package test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
public class Test {
public static void jar(String inputFileName, String outputFileName) throws Exception {
JarOutputStream out = new JarOutputStream(new FileOutputStream(outputFileName));
File f = new File(inputFileName);// 这里应该以那个目录为根目录,jar的根应该是这个目录下的文件
jar(out, f, "");
out.close();
}
private static void jar(JarOutputStream out, File f, String base) throws Exception {
if (f.isDirectory()) {
File[] fl = f.listFiles();
base = base.length() == 0 ? "" : base + "/";
for (int i = 0; i < fl.length; i++) {
jar(out, fl[i], base + fl[i].getName());
}
} else {
out.putNextEntry(new JarEntry(base));
FileInputStream in = new FileInputStream(f);
byte[] buffer = new byte[1024];
int n = in.read(buffer);
while (n != -1) {
out.write(buffer, 0, n);
n = in.read(buffer);
}
in.close();
}
}
public static void main(String[] args) {
try {
jar("e:\\workplace\\test\\bin", "d://test.jar");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
bin下就是包结构,以及.class文件