今天试了一个程序,就是在代码中对文件夹下面的文件(包结构,含class文件)打成jar包,跟我用手动进行打包后内容解压后是一模一样,就是jar包的大小不一样,但是在程序运行时能够加载到我手动打包的b.jar包下的xx.class文件,但是我用代码打包的b.jar却加载不到,说can not find。不知道是什么原因,大家有遇到过吗,真心求教,谢谢。这是我的代码:/**
 * 功能:文件夹的压缩打包(jar)
 * 
 * @param inputFileName
 *            被压缩或者打包的文件夹 outputFileName 压缩后或者打包的文件
 */
public static void jar(String inputFileName, String outputFileName)
throws Exception {
JarOutputStream out = new JarOutputStream(new FileOutputStream(
outputFileName));
jar(out, new File(inputFileName), "");
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 org.apache.tools.zip.ZipEntry(base));
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("G://kaka", "G://b.jar");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}文件结构是kaka/
               com/jtang/component/a.class
                                   b.class
               META-INF/MANIFEST.MF

解决方案 »

  1.   

    你多打了kaka目录进去了;
    jar包应该是
    [code=INIFile]com/jtang/component/a.class
    b.class 
    META-INF/MANIFEST.MF [/code]没有那个kaka才对,代码如下import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.util.jar.JarEntry;
    import java.util.jar.JarOutputStream;class Test {  public static void jar(String inputFileName, String outputFileName) throws Exception {
        JarOutputStream out = new JarOutputStream(new FileOutputStream(outputFileName));
        File f = new File(inputFileName);
        File[] fl = f.listFiles(); // 这里应该以那个目录为根目录,jar的根应该是这个目录下的文件    for (int i = 0; i < fl.length; i++) {
          jar(out, fl[i], "");
        }    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 org.apache.tools.zip.ZipEntry(base));
          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("d://temp//ooola", "d://ooola.jar");
        } catch (Exception e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
      }}
      

  2.   

    我解决了,如果各位能发现问题,那个就是关键点了。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(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", "d://test.jar");
        } catch (Exception e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
      }
    }
      

  3.   

    问题到底出在哪呢,java2000_net 的代码也是可以打成jar包的,但是能不能加载啊???
      

  4.   

    随便写个ant脚本就搞定的事情还要写代码?!
      

  5.   

     我用winzip就能搞定,一行命令的批处理,还用写ant脚本?