Подтвердить что ты не робот

Коррумпированный файл jar

Я создал файл jar в Windows 7, используя eclipse. Когда я пытаюсь открыть файл jar, он говорит о недопустимом или поврежденном файле jar. Может кто подскажет мне, почему файл jar недействителен?

4b9b3361

Ответ 1

Это произойдет, когда вы дважды щелкните JAR файл в проводнике Windows, но JAR сам по себе не является исполняемым JAR. Реальный исполняемый JAR должен иметь по крайней мере класс с методом main() и ссылаться на него в MANIFEST.MF.

В Eclispe вам нужно экспортировать проект как исполняемый JAR файл, а не как JAR файл, чтобы получить реальный исполняемый JAR.

Или, если ваш JAR является единственным контейнером кучки тесно связанных классов (библиотеки), тогда вы не должны дважды щелкнуть его, но откройте его, используя какой-либо инструмент ZIP. Проводник Windows по умолчанию сопоставляет JAR файлы с java.exe, которые не будут работать для таких типов JAR файлов.

Ответ 2

Это происходит регулярно, когда вы изменяете расширение JAR для ZIP, извлекаете содержимое zip и вносите некоторые изменения в такие файлы, как изменение файла MANIFEST.MF, который является очень распространенным случаем, много раз Eclipse не генерирует MANIFEST, как мы хотим, или, возможно, хотим изменить значения CLASS-PATH или MAIN-CLASS.

Проблема возникает, когда вы застегиваете назад папку.

Действительный исполняемый/исполняемый JAR имеет следующую структуру:

myJAR (Main-Directory)
    |-META-INF (Mandatory)
             |-MANIFEST.MF (Mandatory Main-class: com.MainClass)
    |-com 
         |-MainClass.class (must to implement the main method, mandatory)
    |-properties files (optional)
    |-etc (optional)

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

Как только вы закончите, попробуйте выполнить его в командной строке, используя:

java -jar myJAR.jar 

Когда вы используете инструмент zip для распаковки, меняете файлы и снова застегиваете ZIP, обычно структура JAR изменяется на эту структуру, которая неверна, поскольку в верхней части файловой системы добавлен другой уровень каталогов, что делает его поврежденным файлом, как ниже:

**myJAR (Main-Directory)
    |-myJAR (creates another directory making the file corrupted)**
          |-META-INF (Mandatory)
                   |-MANIFEST.MF (Mandatory Main-class: com.MainClass)
          |-com 
              |-MainClass.class (must to implement the main method, mandatory)
          |-properties files (optional)
          |-etc (optional)

:)

Ответ 4

Возможно, из-за проблемы с MANIFEST.MF. Попробуйте запустить основной класс со следующей командой, если вы знаете пакет, в котором находится основной класс.

java -cp launcher/target/usergrid-launcher-1.0-SNAPSHOT.jar co.pseudononymous.Server

Ответ 5

Это распространенная проблема с "манифестом" в ошибке? Да, это происходит очень часто, здесь ссылка: http://dev-answers.blogspot.com/2006/07/invalid-or-corrupt-jarfile.html

Решение:

Использование задачи ant для создания файла манифеста "на лету" дает вам и запись, например:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.2
Created-By: 1.4.2_07-b05 (Sun Microsystems Inc.)
Main-Class: com.example.MyMainClass

Создание самого файла манифеста, с основными соображениями, устраняет проблему:

Manifest-Version: 1.0
Main-Class: com.example.MyMainClass

С большим количеством исследований я уверен, что я мог бы создать динамическое создание метафайлов с ant, как я знаю, другие люди - должна быть какая-то особенность в сочетании моей версии ant (1.6.2)), java-версия (1.4.2_07) и, возможно, текущая фаза луны.

Примечания:

Анализ файла Meta-inf был проблемой, которая появилась, была исправлена, а затем снова всплыла на солнце. Смотрите: Идентификатор ошибки: 4991229. Если вы можете решить, существует ли эта ошибка в вашей (или моей) версии Java SE, у вас больше терпения, чем я.

Ответ 6

Кроме того, убедитесь, что версия java, используемая во время выполнения, является эквивалентной или более поздней версией, чем java, используемая во время компиляции

Ответ 7

Поскольку я только что натолкнулся на эту тему, я хотел бы поделиться причиной и решением, почему я получил сообщение "недействительный или поврежденный jarfile":

Я обновил версию "maven-jar-plugin" в моем pom.xml с 2.1 до 3.1.2. Все по-прежнему прошло нормально, и файл JAR был построен. Но почему-то, очевидно, он больше не будет работать.

Как только я снова установил версию "maven-jar-plugin" на 2.1, проблема исчезла.

Ответ 8

Это может быть опечатка int MANIFEST.MF, p.ex. Дата сборки с двумя :

  Build-Date:: 2017-03-13 16:07:12

Ответ 9

Попробуйте использовать команду jar -xvf fileName.jar, а затем экспортируйте содержимое распакованного файла в новый проект Java в Eclipse.

Ответ 10

Если в конце файла jar есть дополнительные байты, его могут открыть исследователи, такие как 7-Zip, но он будет считаться поврежденным. Я использую систему онлайн-загрузки, которая автоматически добавляет один дополнительный символ LF ('\n', 0x0a) в конец каждого файла JAR. С такими файлами существуют различные решения для запуска файла:

  • Используйте подход praagagubd и укажите .jar как путь к классу и имя основного класса в командной строке
  • Удалите лишний байт в конце файла (с помощью шестнадцатеричного редактора или такой команды, как head -c -1 myjar.jar), а затем выполните jar, дважды облизывая -c или с помощью java -jar myfile.jar как обычно.
  • Измените расширение с .jar на .zip, распакуйте файлы и заново создайте файл .zip, убедившись, что папка META-INF находится на верхнем уровне.
  • Измените расширение .jar на .zip, удалите ненужный файл из .jar и измените расширение обратно на .jar

Все эти решения требуют, чтобы структура .zip и файла META-INF была по существу правильной. Они были проверены только с одним дополнительным байтом в конце почтового индекса, "портящего" его.

Я оказался в head -c -1 *.jar > tmp.jar дважды применив head -c -1 *.jar > tmp.jar. head вставила текст ASCII ==> myjar.jar <== в начало файла, полностью испортив его.

Ответ 11

Возможно, это была просто случайность, но однажды у меня появилась эта ошибка, мне просто пришлось убить все процессы javaw.exe, которые выполнялись в фоновом режиме. Исполняемый JAR работал после этого.