Создайте оправданную банку в 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/
и нажмите ОК.
Пример того, как это выглядит по умолчанию:
Вот как это должно выглядеть после изменения:
РУКОВОДСТВО ПО ИСПРАВЛЕНИЮ ДЛЯ ВХОДА В ПРАВИЛЬНЫЙ ФАЙЛ 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
Надеюсь, это поможет.
Одним из важных правил является то, что файл манифеста должен заканчиваться новой строкой или символом возврата каретки. Если его там нет, добавьте сейчас.
Может быть, этот блог поможет вам.