Как использовать JarOutputStream для создания файла JAR?

Да, если Вы во внутреннюю документацию. Или возможно при записи libary, который будут использовать другие, так, чтобы они могли сказать то, что происходит, не консультируясь с документацией. Бросок или не бросок можно считать частью API, почти как возвращаемое значение.

я соглашаюсь, они не действительно полезны для осуществления стиля Java правильности в компиляторе, но это - лучше чем ничего или случайные комментарии.

53
задан Gili 14 August 2009 в 18:23
поделиться

3 ответа

Оказалось, что JarOutputStream имеет три недокументированных причуды:

  1. Имена каталогов должны заканчиваться косой чертой '/'.
  2. Пути должны использовать косую черту '/' , а не '\'
  3. Записи не могут начинаться с косой черты '/'.

Вот правильный способ создания файла 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();
  }
}
93
ответ дан 7 November 2019 в 08:35
поделиться

Вот пример кода для создания файла JAR с использованием JarOutputStream:

2
ответ дан 7 November 2019 в 08:35
поделиться

Есть еще одна «причуда», на которую следует обратить внимание: все имена JarEntry НЕ должны начинаться с «/».

Например: имя записи jar для файла манифеста - «META-INF / MANIFEST.MF», а не «/META-INF/MANIFEST.MF».

То же правило должно соблюдаться для всех записей jar.

10
ответ дан 7 November 2019 в 08:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: