Создайте оправданную банку в IntelliJ IDEA

Я использую IntelliJ IDEA 12.1.3. У меня есть один модуль, и я пытаюсь преобразовать его в банку в соответствии с шагами, приведенными здесь. Я создал файл jar и переместил файл jar в D:/. Если я пытаюсь запустить эту банку, я получаю следующее сообщение:

Не удалось загрузить атрибут манифеста основного класса из jar

Если я запускаю его с помощью java -classpath jar com.code.TestCase это работает отлично.

Почему это происходит? Я создал банку, используя IntelliJ IDEA. В этой банке есть весь код для всех внешних библиотек, которые я добавил.

В файле манифеста src:

Manifest-Version: 1.0
Main-Class: com.code.TestCase

но содержимое файла манифеста jar:

Manifest-Version: 1.0
Build-Jdk: 1.6.0
Built-By: ubuntu
Created-By: Apache Maven
Archiver-Version: Plexus Archiver

Name: org.apache.log4j
Implementation-Vendor: "Apache Software Foundation"
Implementation-Title: log4j
Implementation-Version: 1.2.15

Почему Main-Class не добавляется в jar-файл MANIFEST.MF, но имеет Main-Class в срк?

3 ответа

Я столкнулся с той же проблемой и обнаружил исправление и / или ошибку в том, как Intellij автоматически заполняет путь для манифеста.

ИНТЕЛЛЕЙ UI

При создании артефакта для создания JAR-файлов IntelliJ автоматически заполняет путь, по которому находится текущий манифест.

т.е. после выбора Main-Class на странице создания артефакта Intellij автоматически добавит следующий путь \src\java\META-INF\MANIFEST.MF. По какой-то причине команда сборки никогда не берет упомянутый файл MANIFEST.MF. Он создает один с нуля без определения основного класса, что приводит к "Не удалось загрузить основной класс"

Если вы используете IntelliJ UI для создания артефактов jar; удалил путь автозаполнения, изменив его на /$PROJECT_DIR/src/ и нажмите ОК.

Пример того, как это выглядит по умолчанию:

настройки артефакта intellij jar по умолчанию

Вот как это должно выглядеть после изменения:

исправлены настройки артефактов intellij

РУКОВОДСТВО ПО ИСПРАВЛЕНИЮ ДЛЯ ВХОДА В ПРАВИЛЬНЫЙ ФАЙЛ MANIFEST.MF

В проекте IntelliJ откройте.idea\artifacts\_jar.xml

Убедитесь, что он содержит

  <element id="directory" name="META-INF">
    <element id="file-copy" path="$PROJECT_DIR$/src/META-INF/MANIFEST.MF" />
  </element>

Возможно, вам придется перезагрузить intelliJ, как только вы это сделаете, чтобы он учитывал изменения в XML-файле.

Для меня это произошло в Maven проектах, где существует другая структура (например, src/main/java/..).

Я использую OSX 10.9.2 с IntelliJ версии 12.1.6

Надеюсь, это поможет.

Одним из важных правил является то, что файл манифеста должен заканчиваться новой строкой или символом возврата каретки. Если его там нет, добавьте сейчас.

Другие вопросы по тегам