Я создал файл jar в Windows 7, используя eclipse. Когда я пытаюсь открыть файл jar, он говорит о недопустимом или поврежденном файле jar. Может кто подскажет мне, почему файл jar недействителен?
Коррумпированный файл jar
Ответ 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)
:)
Ответ 3
Проблема может заключаться в том, что в вашем JAR файле содержится более 65536 файлов: Почему java жалуется на файлы jar с большим количеством записей? Исправление описано в этом вопросе ответ.
Ответ 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 работал после этого.