Обновление файла манифеста jar - java.io.IOException: неверный формат манифеста

Мне нужно обновить манифест в моем jar-файле, который я создаю (экспортирую) в Eclipse. Я пытался выполнить это объяснение безуспешно. Я не совсем уверен, что указывать в командной строке. Веб-сайт Oracle не слишком понятен. Затем я нашел сообщение на SO, в котором говорится, что нужно извлечь файл manifest.mf из архива jar, обновить его и добавить обратно в архив jar. Я тоже это пробовал, и похоже, что оно работает, но во время выполнения я получаю java.io.IOException: invalid manifest format. Как правильно обновить manifest.mf для добавления новых атрибутов? Пример будет наиболее полезным.

7 голосов | спросил rrirower 20 Jam1000000amMon, 20 Jan 2014 01:38:55 +040014 2014, 01:38:55

4 ответа


0

Ссылки, предложенные Питером, были частично полезны. Однако мне удалось решить эту проблему более или менее методом проб и ошибок. Документы Oracle, объясняющие, как это сделать, требуют много работы. Им не хватает хорошего примера того, как действовать. Во всяком случае, для тех, кто сталкивается с теми же проблемами, вот что я сделал. Я создал текстовый файл (например, «Manifest.txt»), используя Блокнот, который содержит атрибуты манифеста, которые я хотел добавить /обновить. При создании этого файла я добавил новую строку в последнюю строку, нажав клавишу на клавиатуре. Затем я создал файл bat для DOS, чтобы сделать реальную модификацию. Вот как это выглядело ...

echo Updating manifest permissions...
"C:\Program Files\Java\jdk1.7.0_25\bin\jar" -umf "c:\some folder\Manifest.txt" "C:\some folder\jartoupdate.jar"

Порядок аргументов jar, связанных с фактическими путями, которые следуют в командной строке, важен. Ссылки из ответа Питера указали на эту часть.

ответил rrirower 26 Jpm1000000pmSun, 26 Jan 2014 22:10:46 +040014 2014, 22:10:46
0

Поскольку файл манифеста содержится в подкаталоге META-INF файла jar с именем MANIFEST.MF. Каждый раз, когда вы создаете файл jar для командной строки с помощью команды jar cvf Jarfilename FilesToadd Затем создается файл манифеста по умолчанию. Можно просмотреть этот файл и получить представление о действительном Manifestfile. Для извлечения файла манифеста из jar введите следующую команду в cmd jar xvf Jarfilename теперь в базовом каталоге появится подкаталог META-INF, здесь вы можете просмотреть файл манифеста по умолчанию. Иногда при обновлении файла манифеста мы получаем java.io.IOException: неверный формат манифеста . Эта ошибка возникает по следующим причинам:

1.Вы не могли оставить пробел между именем и значением любого раздела в файле манифеста,
например, Версия: 1.1 является недействительным разделом, вместо этого напишите Версия: 1.1 , что пробел между двоеточием и 1.1 действительно имеет большое значение.

2. При указании основного класса вы, возможно, добавили расширение .class в конце имени класса. Просто укажите основной класс, набрав Main-Class: Classname .

3. Возможно, вы не добавили символ новой строки в конец файла. Вам не нужно писать \ n для указания новой строки, вместо этого просто оставьте последнюю строку вашего файла манифеста пустой, которая будет служить цели

4.В вашем текстовом файле для манифеста должна использоваться кодировка UTF-8 , иначе вы можете столкнуться с некоторыми проблемами.

Наконец, я привожу пример того, как должен выглядеть файл манифеста. Здесь пакет - калькулятор, а основной класс - Calculator.java

Manifest-Version: 2.1

Создано: UselessCoder

Имя пакета: калькулятор

Имя класса: calculator.Calculator.java

Main-Class: calculator.Calculator

ответил Abhey Rana 4 J0000006Europe/Moscow 2016, 06:15:17
0

При изменении содержимого банки вы должны больше смотреть в этом направлении:
http://docs.oracle.com/javase/tutorial/deployment/jar/update.html и особенно
http://docs.oracle.com/javase/tutorial/deployment/jar/modman.html , который описывает процесс
обновление манифеста.

ответил Peter 20 Jam1000000amMon, 20 Jan 2014 02:20:44 +040014 2014, 02:20:44
0

Чтобы обновить манифест в файле jar, вы нашли ответ в документации Oracle. Вот другое место, чтобы увидеть ответ. Предполагая, что у вас есть доступ для чтения к каталогу, где установлен JDK, и документация была загружена вместе с ним (скачать документацию легко, это для SE7 http://www.oracle.com/technetwork/java/javase/documentation/java-se-7-doc -Скачать-435117.html ):

  1. перейдите в [каталог_установки] /docs . Там есть файл index.html .
    >>> например мой для JDK 6 называется C: \ my_TOOLS \ Java_stuff \ jdk_1.6.0_20 \ docs \ index.html

  2. Перетащите index.html на страницу браузера.

  3. На этой странице представлен обзор документации JDK и много ссылок на полезную информацию. JDK 6 В строке верхнего поля под строкой языка Java щелкните JAR. Вы попадете на страницу с краткой информацией о документации (со ссылками) jartool.
    В разделе «Инструменты JAR» на этой странице щелкните ссылку на справочную страницу для вашей платформы (вам, вероятно, нужна «Справочная страница инструмента JAR для Windows»).

  4. На этой странице справки по инструменту JAR показана подробная документация по команде jar. Здесь вы увидите пример « jar umf Manifest.txt my_jar.jar ». (Solaris /Linux не использует «-» перед аргументами, такими как «umf».


Я использовал его (в Linux), чтобы объединить 2 пользовательских файла Манифеста в Манифест по умолчанию и поместить его в мою банку. Я делаю это в два этапа, но мне было бы интересно узнать об одношаговой команде для этого. (Использование двух m в команде jar приводит к тому, что второй манифест перезаписывает первый манифест, а не объединяется.) (Помните, что каждый файл манифеста должен заканчиваться пустой строкой.)

Manifest.txt содержит «Имя:» и «Реализация-версия:»
Manifest.my_app.txt содержит «Main-Class:» и «Class-Path:»
манифест по умолчанию содержит «Manifest-Version:» и «Created-By:»

jar cmf my_app.jar Manifest.txt my_main.class my_utils.class
jar umf Manifest.my_app.txt my_app.jar 


После этого мой META-INF /MANIFEST.MF содержит все поля из всех трех манифестов. Я ожидал, что они будут добавлены друг к другу, но поля перемешаны. Может быть, кто-то может сказать, как заказать их или прямо добавить. Это порядок, в котором они появляются в моем текущем файле META-INF /MANIFEST.MF .

Manifest-Version: 1.0
Implementation-Title: my_app
Implementation-Version: 1.2.1
Class-Path: ...
Name: My App
Created-By: 1.6.0_20 (Oracle Corporation)
Main-Class: My_App

Надеюсь, что это вам пригодится.

ответил Iceberg 25 AMpFri, 25 Apr 2014 00:59:41 +040059Friday 2014, 00:59:41

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132