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

<p>я создал jar-файл в windows 7, используя eclipse. когда я пытаюсь открыть файл jar, он говорит, неверный или поврежденный файл jar. кто-нибудь может подсказать, почему файл jar является недействительным?</p>

<p>это произойдет, если дважды щелкнуть файл jar в проводнике windows, но сам jar фактически не является<strong> исполняемым файлом </strong>jar. реальный исполняемый jar-файл должен иметь хотя бы класс с методом <code>main()</code> и ссылаться на него в <code>manifest.mf</code>.</p><p>в eclispe вам нужно экспортировать проект как <em>runnable jar-файл</em>, а не как <em>jar-файл</em>, чтобы получить реальный исполняемый jar-файл.</p><p>или, если ваш jar-файл представляет собой контейнер из нескольких тесно связанных классов (библиотеки), вам не следует дважды щелкать по нему, а открывать его с помощью какого-либо инструмента zip. проводник windows, а именно по умолчанию, связывает файлы jar с <code>java.exe</code>, что не подойдет для таких библиотек jar.</p>

<p>это регулярно происходит, когда вы меняете расширение в jar для zip, извлекаете содержимое zip и вносите некоторые изменения в файлы, такие как изменение файла manifest.mf, что является очень распространенным случаем, во многих случаях eclipse не генерирует файл manifest как мы хотим, или, может быть, мы хотели бы изменить значения class-path или main-class для него. </p><p>проблема возникает, когда вы архивируете папку назад.</p><p>допустимый runnable/исполняемый jar имеет следующую структуру:</p><pre><code>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) </code></pre><p>если ваш jar соответствует этим правилам, это будет работать, не имеет значения, если вы создадите его вручную с помощью инструмента zip, а затем измените расширение на .jar</p><p>когда вы закончите, попробуйте выполнить его в командной строке, используя:</p><pre><code>java -jar myjar.jar </code></pre><p>когда вы используете инструмент zip для распаковки, изменения файлов и zip снова, обычно структура jar изменяется на эту структуру, что неверно, так как в верхней части файловой системы добавляется другой уровень каталога, что делает его поврежденным файлом, как показано ниже:</p><pre><code>**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) </code></pre><p>:)</p>

<p>возможно, проблема в том, что в вашем jar-файле содержится более 65536 файлов: <a href="https://stackoverflow.com/questions/18441076/why-java-complains-about-jar-files-with-lots-of-entries">почему java жалуется на файлы jar с большим количеством записей?</a> исправление описано в этом вопросе <a href="https://stackoverflow.com/a/18441359/90874">ответ</a> .</p>

<p>может быть из-за проблемы с <code>manifest.mf</code>. попробуйте запустить основной класс с помощью следующей команды, если вы знаете пакет, в котором расположен основной класс.</p><pre><code>java -cp launcher/target/usergrid-launcher-1.0-snapshot.jar co.pseudononymous.server </code></pre>

<p>это общая проблема с "манифестом" в ошибке? да, это часто случается, вот ссылка: <a href="http://dev-answers.blogspot.com/2006/07/invalid-or-corrupt-jarfile.html">http://dev-answers.blogspot.com/2006/07/invalid-or-corrupt-jarfile.html</a> </p><blockquote> <p><strong>решение:</strong></p> <p>использование задачи ant для создания файла манифеста на лету дает вам следующую запись:</p> <pre><code>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 </code></pre> <p>создание файла манифеста самостоятельно, с помощью базовых функций, устраняет проблему:</p> <pre><code>manifest-version: 1.0 main-class: com.example.mymainclass </code></pre> <p>после более подробного изучения я уверен, что я мог бы создать динамическое создание метафайла, работая с ant, как, как я знаю, делают другие люди - должна быть некоторая особенность в сочетании моей версии ant (1.6.2) и версии java (1.4. 2\_07) и, возможно, текущая фаза луны.</p> <p><strong>заметки:</strong></p> <p>синтаксический анализ файла meta-inf был проблемой, которая возникла, была исправлена, а затем снова возникла для sun. смотрите: <a href="http://bugs.java.com/bugdatabase/view\_bug.do?bug\_id=4991229">идентификатор ошибки: 4991229</a> . если вы можете решить, существует ли эта ошибка в вашей (или моей) версии java se, у вас больше терпения, чем у меня. </p> </blockquote>

<p>это может быть также опечатка в <code>manifest.mf</code>, p.ex. дата сборки с двумя <code>:</code></p><pre><code> build-date:: 2017-03-13 16:07:12 </code></pre>

<p>попробуйте использовать команду jar -xvf filename.jar, а затем выполните экспорт содержимого распакованного файла в новый проект java в eclipse. </p>

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

<p>если в конце файла jar есть дополнительные байты, его могут открыть исследователи, такие как 7-zip, но он будет считаться поврежденным. я использую систему онлайн-загрузки, которая автоматически добавляет один дополнительный символ lf ('\ n', 0x0a) в конец каждого файла jar. с такими файлами существуют различные решения для запуска файла:</p><ul> <li>используйте <a href="https://stackoverflow.com/a/26572349/1048186">praagagubd</a> подход и укажите .jar как путь к классу и имя основного класса в команде prompt</li> <li>удалите лишний байт в конце файла (с помощью hex-редактора или команды, подобной <code>head -c -1 myjar.jar</code>), а затем выполните jar, дважды щелкнув мышью или с помощью <code>java -jar myfile.jar</code> как обычно. </li> <li>измените расширение с .jar на .zip, извлеките файлы и заново создайте файл .zip, убедившись, что папка meta-inf находится на верхнем уровне.</li> <li>изменив расширение .jar на .zip, удалив ненужный файл из .jar и вернув расширение на .jar.</li> </ul><p>все эти решения требуют, чтобы структура файлов .zip и meta-inf была по существу правильной. они были протестированы только с одним дополнительным байтом в конце zip, «портящим» его.</p><p>я попал в настоящий беспорядок, применив <code>head -c -1 *.jar > tmp.jar</code> дважды. <code>head</code> вставил текст ascii <code>==> myjar.jar <==</code> в начале файла, полностью повредив его. </p>