Неправильный Manifest.mf в IntelliJ IDEA создан .jar

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

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

в банке используется тот, который поставляется в 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

У меня была та же проблема.

Убедитесь, что ваш MANIFEST.MF находится в:

src/main/resources/META_INF/

НЕ

src/main/java/META_INF/

Ответ 2

Чтобы исправить:

  • Файл > Структура проекта
  • В разделе "Настройки проекта" слева выберите "Артефакты"
  • Найти определение JAR В средней панели и выбрать его
  • В левой панели вкладки "Output Layout" найдите файл jar в списке и выберите его
  • Внизу нажмите кнопку "Использовать существующий манифест" и выберите файл манифеста, который находится в источнике проекта.
  • Нажмите "ОК" и запустите сборку

Ответ 3

Как отмечено в комментарии @grudolf в одном из других ответов, один из способов сделать это (и единственный, который работал у меня в импортированном проекте Gradle), - создать пустую банку следующим образом:

  • Структура проекта → Артефакты → + Jar → Пусто
  • В центральной панели теперь есть кнопка "Создать манифест" и "Использовать существующие кнопки манифеста". Используйте один из них.
  • У меня возникли трудности, если я извлек зависимые библиотеки с их собственными манифестами в выходной корень, они, казалось, периодически перезаписывали новый созданный вручную манифест. Беспокойство с порядком операций, казалось, заставило его работать.

UPDATE:

Это определенно ошибка в 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>

Ответ 4

Если вы хотите указать Main Class, вы должны добавить этот плагин в 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>

Ответ 5

Существует несколько способов создания исполняемых банок. Использование функции IntelliJ GUI - один из лучших способов. Другой способ - использовать Maven (или аналогично в gradle, buildr и т.д.), Который является дружественным к серверу:

Он более или менее копирует вставку из примеров optaplanner maven build:

Ответ 6

У меня была аналогичная проблема.

Проблема была в файле pom.xml.

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

Я не знаю, по какой причине этот код работает в eclipse, но не в IntelliJ

Это правильно.

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

Manifest.mf работает!!!

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

Ответ 7

Чтобы не было проблем, таких как манифест, у вас должен быть каталог с именем "META-INF" в каталоге "src". Итак, создайте его и поместите в него файл с именем "MANIFEST.MF" со следующим содержимым:

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

Не забывайте заменить имя пакета, содержащего основной класс выше!