Создание 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

enter image description here

Ответ 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.

enter image description here

Ответ 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:

enter image description here

Ответ 8

Я нашел другое решение для опубликованных. В диалоговом окне структуры проекта IntelliJ, используемом для создания содержимого файла.jar, мне пришлось вручную добавить папку META-INF, содержащую файл манифеста. Вот как это выглядит в конце диалогового окна структуры проекта. Если вы не видите папку в списке содержимого jar, файл манифеста не является частью файла jar.

This is part of the Project Structure Dialog box

Способ, которым я включаю папку вручную, - это щелкнуть знак "плюс", выбрать опцию "Содержимое каталогов", а затем перейти к папке META-INF.