Как мне обновить уже существующий файл Jar - PullRequest
0 голосов
/ 05 ноября 2008

У меня есть файл WAR, к которому мне нужно добавить два файла. В настоящее время я делаю это:

File war = new File(DIRECTORY, "server.war");
JarOutputStream zos = new JarOutputStream(new BufferedOutputStream(new FileOutputStream(war)));

//Add file 1
File file = new File(DIRECTORY, "file1.jar");
InputStream is = new BufferedInputStream(new FileInputStream(file));
ZipEntry e = new ZipEntry("file1.jar");
zos.putNextEntry(e);
byte[] buf = new byte[1024];
int len;
while ((len = is.read(buf, 0, buf.length)) != -1) {
    zos.write(buf, 0, len);
}
is.close();
zos.closeEntry();

//repeat for file 2

zos.close();

В результате предыдущее содержимое становится засоренным: в WAR есть только 2 файла, которые я только что добавил. Есть какой-то режим добавления, который я не использую или что?

Ответы [ 3 ]

6 голосов
/ 05 ноября 2008

Да, в конструкторе FileOutputStream есть дополнительный логический аргумент, который позволяет принудительно добавлять его в файл, а не перезаписывать его. Измените свой код на

JarOutputStream zos = new JarOutputStream(new BufferedOutputStream(new FileOutputStream(war, True)));

и оно должно работать так, как вы хотите.

2 голосов
/ 06 ноября 2008

Кажется, это невозможно. Я думал, что это было какое-то время, но кажется, что это не совсем тот эффект, который я хотел. Выполнение этого способа привело к эквиваленту двух отдельных jar-файлов, соединенных вместе. Странная часть заключалась в том, что инструменты имели какой-то смысл. JAR нашел первый оригинальный файл jar и прочитал его мне. Загрузчик классов Glassfish находил более позднюю новую часть, в результате чего загружались только добавленные файлы, как если бы они были всем приложением. Weird.

Итак, я вернулся к созданию новой войны, добавлению содержимого старых, добавлению новых файлов, закрытию и копированию новых поверх старых.

0 голосов
/ 21 июля 2010

У меня такая же проблема; Я ищу простой способ обновить файл в существующий файл JAR. Если так просто выполнить команду «jar uf foo.jar ...», почему нет способа использовать Java API для того же?

В любом случае, вот RFE для добавления этой функциональности в Java; он также предлагает некоторые обходные пути:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4129445

А вот библиотека, которая призвана упростить эту задачу, рассматривая JAR / ZIP как виртуальные каталоги:

https: // truezip.dev.java.net

Я еще не выяснил, какой подход я собираюсь использовать для моей текущей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...