Создайте эксплоативную банку в IntelliJ IDEA

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

Не удалось загрузить атрибут манифеста Main-Class из 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 в src?

Ответ 1

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

INTELLIJ UI

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

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

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

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

default intellij jar artifact settings

Теперь это то, что должно выглядеть после изменения:

fixed intellij artifact settings

MANUAL FIX ДЛЯ ВХОДА В ПРАВИЛЬНЫЙ МАНИФЕСТ .MF FILE

В проекте 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

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

Ответ 2

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