#java #ruby #jar #filesystems
#java #ruby #jar #файловые системы
Вопрос:
моя проблема в том, что я хочу добавить некоторые файлы .class из обычного каталога в файл .jar. Должен ли я извлекать его раньше или я могу добавлять файлы «на лету»?
Ответ №1:
Хотя я согласен с Джорданом и предлагаю использовать системную команду, это было не вариант для команды, в которой я работаю.
Если вам нужно использовать его второе решение, чрезвычайно важно отметить, что Zip::ZipOutputStream переопределит все существующие jar; т. Е. Вы не будете добавлять к существующему jar, вы будете создавать новый. Этот код добавит файл в существующий jar:
require 'zip/zip'
Zip::ZipFile::open 'path/to/jar' do |jar|
jar.add 'filename_in_jar', 'path/to/file/you/want/to/add'
end
Ответ №2:
Если бы это был я, я бы почти наверняка просто вызвал jar
команду в Ruby, чтобы сделать это:
system 'jar uf jar_file.jar input_file(s).class'
# or
%x[ 'jar uf jar_file.jar input_file(s).class' ]
Если вы все еще хотите сделать это без вызова jar
, вы должны иметь возможность сделать это с помощью rubyzip, поскольку файлы JAR — это просто ZIP-файлы с определенной структурой. Что-то вроде этого:
require 'zip/zip'
filename = 'class_file.class'
Zip::ZipOutputStream::open "jar_file.jar" do |zip|
zip.put_next_entry 'dest/path/in/jar/' filename # don't forget the path
File.open filename, 'rb' {|f| zip.write f.read }
end
Есть также несколько оболочек Ruby для libarchive, которые могли бы это сделать. Например.