Cara menggunakan JarOutputStream untuk membuat file JAR?

Bagaimana cara membuat file JAR pemrograman menggunakan java.util.jar.JarOutputStream? JAR file yang dihasilkan oleh program saya terlihat benar (itu ekstrak baik-baik saja) tapi ketika saya mencoba memuat perpustakaan dari Java mengeluh bahwa ia tidak dapat menemukan file yang jelas yang tersimpan di dalamnya. Jika saya ekstrak file JAR dan menggunakan Sun'sjar` command-line tool untuk re-kompres yang dihasilkan perpustakaan bekerja dengan baik. Singkatnya, ada sesuatu yang salah dengan saya file JAR.

Tolong jelaskan cara membuat file JAR pemrograman, lengkap dengan manifest file.

Mengomentari pertanyaan (1)
Larutan

Ternyata JarOutputStream memiliki tiga berdokumen kebiasaan:

  1. Nama direktori harus berakhir dengan '/' slash.
  2. Jalan harus menggunakan '/' garis miring, tidak '\'
  3. Entri mungkin tidak dimulai dengan '/' slash.

Berikut ini adalah cara yang benar untuk membuat file Jar:

public void run() throws IOException
{
  Manifest manifest = new Manifest();
  manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
  JarOutputStream target = new JarOutputStream(new FileOutputStream("output.jar"), manifest);
  add(new File("inputDirectory"), target);
  target.close();
}

private void add(File source, JarOutputStream target) throws IOException
{
  BufferedInputStream in = null;
  try
  {
    if (source.isDirectory())
    {
      String name = source.getPath().replace("\\", "/");
      if (!name.isEmpty())
      {
        if (!name.endsWith("/"))
          name += "/";
        JarEntry entry = new JarEntry(name);
        entry.setTime(source.lastModified());
        target.putNextEntry(entry);
        target.closeEntry();
      }
      for (File nestedFile: source.listFiles())
        add(nestedFile, target);
      return;
    }

    JarEntry entry = new JarEntry(source.getPath().replace("\\", "/"));
    entry.setTime(source.lastModified());
    target.putNextEntry(entry);
    in = new BufferedInputStream(new FileInputStream(source));

    byte[] buffer = new byte[1024];
    while (true)
    {
      int count = in.read(buffer);
      if (count == -1)
        break;
      target.write(buffer, 0, count);
    }
    target.closeEntry();
  }
  finally
  {
    if (in != null)
      in.close();
  }
}
Komentar (14)

Ada's "permainan kata-kata" memperhatikan: Semua JarEntry's nama TIDAK harus dimulai dengan "/".

Misalnya: jar entri nama untuk file manifest adalah "META-INF/MANIFEST.MF" dan "/META-INF/MANIFEST.MF".

Aturan yang sama harus diikuti untuk semua jar entri.

Komentar (1)

Berikut ini's beberapa contoh kode untuk membuat file JAR menggunakan JarOutputStream:

Komentar (3)

Anda dapat melakukannya dengan kode ini:

public void write(File[] files, String comment) throws IOException {
    FileOutputStream fos = new FileOutputStream(PATH + FILE);
    JarOutputStream jos = new JarOutputStream(fos, manifest);
    BufferedOutputStream bos = new BufferedOutputStream(jos);
    jos.setComment(comment);
    for (File f : files) {
        print("Writing file: " + f.toString());
        BufferedReader br = new BufferedReader(new FileReader(f));
        jos.putNextEntry(new JarEntry(f.getName()));
        int c;
        while ((c = br.read()) != -1) {
            bos.write(c);
        }
        br.close();
        bos.flush();
    }
    bos.close();
//  JarOutputStream jor = new JarOutputStream(new FileOutputStream(PATH + FILE), manifest);

}

PATH variabel: path ke file JAR

FILE variabel: nama dan format

Komentar (6)