Неправильний маніфест.mf в IntelliJ IDEA створений .jar


102

Я намагаюся упакувати проект, використовуючи бібліотеки OptaPlanner 6.0.1, в .jar через jar артефакт IntelliJ IDEA, але замість мого маніфесту.mf, що містить стандарт

Manifest-Version: 1.0
Main-Class: a.b.c.app

jar використовує ту, що постачається у ecj-3.7.2.jar, одній із підтримуючих бібліотек OptaPlanner:

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

Через це "no main manifest attribute, in appname.jar"трапляється помилка при спробі запуску програми. Якщо я вручну замінюю маніфест у .jar-файлі моїм, все працює правильно. Чи можна щось зробити, щоб виправити це?

Я зберігаю бібліотеки в окремому каталозі / lib, і вони були додані до кореня артефакту jar як Extracted Directory, IntelliJ IDEA - v13.0.1.


1
Чи знаєте ви такі інструменти для побудови, як мурашник, мавен або градель?
MariuszS

Я знаю про них, але поки що я використовував лише аналоги make і .NET (NAnt, MSBuild). Який із них я повинен вибрати, якщо інструмент збірки IntelliJ не виріже?
грудольф

1
Проголосуйте, щоб виправити це питання тут ,
bigjosh

Відповіді:


260

У мене була така ж проблема.

Переконайтесь, що ваш MANIFEST.MF знаходиться у:

src/main/resources/META_INF/

НЕ

src/main/java/META_INF/

20
Це дійсно правильна відповідь, схоже, що Intellij IDEA неправильно
замінює

У моєму випадку мені довелося змінити макет свого проекту. Раніше у мене був проект з Maven layout, але я зняв підтримку maven. Я відтворюю проект з нуля і зараз він працює.
Максенсія

1
Це не працювало для мене, мені довелося перемістити файл Mainfest до кореня проекту.
racs

Хіба Мейвен настільки дурний, що розміщує цей файл у неправильному режимі? : ^)
Дар’я

@Kumait, проблема все ще існує в IntelliJ 2017.1.5. Мені цікаво, чи знає команда JetBrain про це.
fruqi

12

Виправити:

  1. Файл> Структура проекту
  2. У розділі Налаштування проекту зліва виберіть "Артефакти"
  3. Знайдіть визначення JAR у середній панелі та виберіть його
  4. На лівій панелі вкладки "Макет виводу" знайдіть файл jar у списку та виберіть його
  5. Унизу натисніть кнопку "Використовувати існуючий маніфест" та виберіть файл маніфесту, який знаходиться у джерелі вашого проекту.
  6. Клацніть OK і запустіть збірку

3
Немає кнопки "Використовувати існуючий маніфест", проте файл Manifest у макеті виводу вказує на правильне розташування (... \ src \ main \ java \ META-INF \ MANIFEST.MF)
grudolf

5
Добре, довелося видалити артефакт jar і відтворити його, цього разу як "Порожній" замість "З модулів із залежностями". Отримав кнопки «Створити маніфест» та «Використовувати існуючий маніфест», вказав на мій Маніфест і прочитав бібліотеки та компілював вихід. Є дві відмінності від раніше: META_INF \ MANIFEST.INF тепер явно включений у вихідний макет, і файл jar видається, що генерується правильно. :)
грудольф

Принаймні, це не вирішує проблему. Відповідь Джамана все-таки спрацювала.
Андрій Брекса

Коментар, який додав користувач з низьким користувачем @ ds-Justice наступним чином - коментар @ grudolf вище щодо створення порожнього Jar був єдиним, що працювало для мене після кількох годин боротьби з імпортованим проектом Gradle. Це важливе питання. Будь ласка, розгляньте повторний коментар як окрему відповідь.
Шон Механ

10

Як зазначається в коментарі @ grudolf в одній з інших відповідей, один із способів зробити це (і єдиний, який працював на мене в імпортному проекті Gradle) - створити порожню банку таким чином:

  • Структура проекту -> Артефакти -> + Jar -> Порожня
  • Тепер у вікні Центру є кнопки Створити маніфест та використовувати існуючі кнопки маніфесту. Скористайтеся одним із них.
  • У мене виникли труднощі, якщо я вилучав залежні бібліотеки з їх власними маніфестами у вихідний корінь, вони, здавалося, переривали перезаписи нового створеного вручну маніфесту. Збиття з порядком операцій, здавалося, змусило його працювати.

ОНОВЛЕННЯ:

Це, безумовно, помилка в Idea. Ця пов'язана відповідь надійно працює, коли є вилучені каталоги. По суті, ви знайдете .idea / JARNAME.xml, додайте наступний елемент у верхню частину <root>елемента вашої банки. Будь-які витягнуті елементи над вашою новою копією файлу, що містять маніфест, перекриють ваш новий маніфест.

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

7

Якщо ви хочете вказати основний клас, вам слід додати цей плагін до pom.xml:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>Form</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

1

У мене була схожа проблема.

Проблема була у файлі pom.xml.

<archive>
  <manifestEntries>
    <Dependencies>one.jar,
                  two.rar, 
                  other.jar
    </Dependencies>
  </manifestEntries>
</archive>

Я не знаю, з якої причини цей код працює в затемненні, але не в IntelliJ

Це правильно.

<archive>
  <manifestEntries>
    <Dependencies>one.jar, two.rar, other.jar</Dependencies>
  </manifestEntries>
</archive>

Manifest.mf працював !!!

Я сподіваюся, що це допомагає.


У мене була така точна ситуація, і я дійшов того ж висновку, що і ви: нові рядки між пунктами <Залежності> працювали в Eclipse, але не в Intellij IDEA.
Аріон Краузе

0

Існує кілька способів генерації виконуваних банок. Використання функції GUI IntelliJ - один хороший спосіб. Інший спосіб - використовувати Maven (або аналогічно в gradle, buildr тощо), який є зручним для сервера build:

Це більш-менш копіювальна копія з прикладів optaplanner maven build:

  1. Jar кінцевого користувача (optaplanner-прикладів - *. Jar) повинен включати в свій маніфест класний шлях його залежностей .
  2. Потім сценарій sh і bat повинен запустити цю банку відповідно.

0

Щоб у вас не було таких проблем, як Manifest, у каталозі "src" вам слід мати каталог з назвою "META-INF". Отже, створіть його та помістіть у нього файл з назвою "MANIFEST.MF" із таким вмістом:

Manifest-Version: 1.0
Main-Class: <packageName>.Main

Не забув замінити ім'я пакета, що містить основний клас вище!


4
Запис показує, що я обрізав релігійний матеріал з вашої посади в серпні. Зверніть увагу, що громада обговорювала питання щодо додавання релігійних тем до публікацій, і відповідь полягає в тому, що ми хотіли б, щоб вони не залишилися. Проте ви можете додати їх у свій профіль або аватар.
півзахисник
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.