it-swarm.com.ru

Поврежденный файл jar

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

28
Neel

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

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

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

38
BalusC

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

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

Допустимый Runnable/Исполняемый 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)

:)

17
Israelm

Возможно, проблема в том, что в вашем JAR-файле содержится более 65536 файлов: Почему Java жалуется на файлы JAR с большим количеством записей? Исправление описано в этом вопросе ответ .

10
thSoft

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

Java -cp launcher/target/usergrid-launcher-1.0-SNAPSHOT.jar co.pseudononymous.Server
9
prayagupd

Это общая проблема с "манифестом" в ошибке? Да, это часто случается, вот ссылка: 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 был проблемой, которая возникла, была исправлена, а затем снова возникла для Sun. Смотрите: Идентификатор ошибки: 4991229 . Если вы можете решить, существует ли эта ошибка в вашей (или моей) версии Java SE, у вас больше терпения, чем у меня. 

3
Coffee

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

  Build-Date:: 2017-03-13 16:07:12
0
Olivier Faucheux

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

0
mcginn

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

0
Mr. Whoa

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

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

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

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

0
Josiah Yoder