Создание Jar с Intellij 2016 - Нет основного атрибута манифеста
Я не получаю no main manifest attribute
при запуске jar create by Intellij. Я извлек банк и заметил, что есть еще один файл манифеста, а не тот, который я указал при создании артефакта.
Когда я открываю манифест в среде IDE, он отображает все правильно, но после создания jar я получаю целый новый файл манифеста.
Manifest-Version: 1.0
Main-Class: YoutubeList
Я пробовал каждое решение из других ответов и все еще не понял его. Почему создание простой банки - чертовски сложная задача в Intellij, она должна была помочь разработчикам!
отредактированный
И иногда он не включает файлы.class в Jar, результаты которых could not found or load class
Ответы
Ответ 1
У меня была проблема с maven build. Когда вы создаете артефакт из настроек структуры проекта (ctrl + alt + shift + S), вам нужно изменить каталог манифеста:
<project folder>\src\main\java
изменить java на ресурсы
<project folder>\src\main\resources
Я также использовал экстракт варианта для целевого JAR, и он работает хорошо.
РЕДАКТИРОВАТЬ
Подробные пошаговые инструкции вы найдете здесь: fooobar.com/questions/27682/...
Ответ 2
Я потратил несколько дней, чтобы решить это. Мое решение: я загрузил проект, который представлен в этом ответе. Затем я сравнил и исправил настройки загруженного проекта и моего собственного проекта. Я сравнил/исправил:
- Запуск/отладка конфигураций
- MANIFEST.MF
- в настройках Progect Structure: Проект, Модули (отметьте, что
источники, ресурсы и т.д.), артефакты.
В конце концов, я поместил META-INF в каталог ресурсов.
Может быть, я сделал лишние действия, но у меня это сработало :)
Постскриптум Также необходимо выбрать "Унаследовать выходной путь компиляции проекта" в настройках Progect Structure → Modules → Path
Ответ 3
Убедитесь, что ваш pom.xml имеет основной класс, на который ссылаются и полностью соответствует, например:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<mainClass>org.mypkg.MyMainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
(... конечно, номер версии плагина может быть другим).
Основной класс, не полностью квалифицированный, - это то, что заставляет людей предлагать перемещать манифест в другое место (чтобы удовлетворить локальную локальность).
Ответ 4
Поместить папку META-INF в */resources
можно, но это не так: Intellij просто помещает все под main/resources
или test/resources
в корневой уровень сгенерированного jar, вот почему это работает; но в Java-проекте мы обычно помещаем их в корневой каталог проекта, что соответствует уровню src
. Помещение их в "ресурсы" нарушает соглашение, кроме того, они не являются файлами ресурсов.
Убедитесь, что вы:
- использовать существующий файл
MANIFEST.MF
в корневом каталоге проекта;
- основной класс правильный
- отметили
Include in Project build
в разделе "Структура проекта" → "Артефакты"
- иметь папку
META-INF
в файлах для включения в jar, кроме "скомпилированного вывода проекта", на вкладке Output Layout
- сгенерированный тип файла - JAR, в правом верхнем углу
Затем сохраните настройки, выполните повторную сборку и войдите в меню "Построить" в "Построить артефакты..." и "собрать" JAR. Проверьте сгенерированную банку еще раз, запустите с java -jar
.
Ответ 5
На самом деле я решил это, добавив следующие строки в build.gradle
jar {
manifest {
attributes 'Main-Class': 'class name'
}
from {
configurations.compile.collect {
it.isDirectory()? it: zipTree(it)
}
}
}
Ответ 6
В разделе " Project structure
File
/Project structure
/Artifacts
вы можете указать, как будет строиться ваша банка. Вы можете выбрать либо использовать существующий файл как ваш манифест, либо создать новый, и в этом случае вы укажете путь основного класса и класса...
Ответ 7
В моем случае в банку были добавлены некоторые зависимости, которые сами генерировали манифест. Я не получил его работать прямо из Intellij. Однако вы можете открыть файл jar с помощью zip-программы и самостоятельно добавить класс Main, а затем скопировать его обратно в jar:
Ответ 8
Я нашел другое решение для опубликованных. В диалоговом окне структуры проекта IntelliJ, используемом для создания содержимого файла.jar, мне пришлось вручную добавить папку META-INF, содержащую файл манифеста. Вот как это выглядит в конце диалогового окна структуры проекта. Если вы не видите папку в списке содержимого jar, файл манифеста не является частью файла jar.
Способ, которым я включаю папку вручную, - это щелкнуть знак "плюс", выбрать опцию "Содержимое каталогов", а затем перейти к папке META-INF.