Плагин сборки Maven не устанавливает настройку манифеста MainClass

У меня есть проект maven, который генерирует банку через плагин сборки maven, который я хочу запустить как консоль приложение. Однако атрибут MainClass не устанавливается в MANIFEST.MF. Вот моя конфигурация плагина:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.2.1</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                    <manifest>
                        <mainClass>net.justaprogrammer.poi.cleanser.Cleanser</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

Однако это не добавляется к MANIFEST.MF в jar, созданном mvn package. Сгенерированный манифест приведен ниже:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: zippy
Build-Jdk: 1.6.0_25

Что я делаю неправильно?


person Justin Dearing    schedule 16.10.2011    source источник
comment
Это работает точно так, как рекламируется. Вы уверены, что смотрите в правильную выходную емкость?   -  person Ryan Stewart    schedule 16.10.2011
comment
Насколько я могу судить, да. В моем pom.xml нет плагинов с именем jar. Как я сказал в своем редактировании, я использую mvn package для создания своей банки. Этот jar-файл называется PoiCleanser-0.1.0.BUILD-SNAPSHOT.jar и находится в корне целевой папки.   -  person Justin Dearing    schedule 16.10.2011


Ответы (4)


Я пропустил, что вы не создавали свою сборку в package. У вас есть проект jar, поэтому Maven создаст jar, используя maven-jar-plugin. Вам не обязательно иметь что-нибудь в помпе, чтобы это сказать. На вас работает стандартная конфигурация Maven. В создаваемом jar-файле будут только классы и ресурсы вашего проекта. Если вы хотите добавить основной класс к манифесту в этой банке, вы должны настройте для этого плагин jar. По сути, просто переместите эту archive конфигурацию в плагин jar.

Однако, если вы действительно хотите собрать исполняемую толстую банку, то есть банку, которая включает в себя все ваши классы, а также классы всех ваших зависимостей, тогда у вас есть настройка в нужном месте, но вам нужно для фактического запуска подключаемого модуля сборки либо с помощью mvn assembly:single, либо с помощью привязки, от цели к этапу жизненного цикла. Для ясности: если вы это сделаете, то ваш проект выведет два jar-файла: один, содержащий файлы вашего проекта, и другой, содержащий их, а также содержимое всех библиотек, от которых зависит ваш проект. Первый построен плагином jar. Последний создается плагином сборки. Обратите внимание, что толстые банки обычно не используются, и вы можете столкнуться с необычными проблемами при их использовании, потому что они выходят за рамки обычных вещей Java.

person Ryan Stewart    schedule 16.10.2011
comment
Райан, это очень информативно. Я не особо женат на толстой банке, но рад, что теперь понимаю разницу. Я протестирую и отмечу ваш ответ как правильный. - person Justin Dearing; 17.10.2011
comment
Райан, я только что попробовал mvn assembly:single, и у меня есть толстая банка со всеми моими зависимостями, главный класс в моем MANIFEST.MF, но на самом деле у меня нет кода, который я написал в нем. Я думаю, что плагин jar лучше всего, но я бы хотел и подходящий плагин jar. - person Justin Dearing; 22.10.2011
comment
По сборке плагина сделаю отдельный вопрос. - person Justin Dearing; 22.10.2011

Для поклонников копирования и вставки, таких как я, собранный из приведенного выше ответа и http://maven.apache.org/plugins/maven-assembly-plugin/usage.html#Execution:_Building_an_Assembly:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
      <archive>
        <manifest>
          <mainClass>com.db.search.filenet.Load</mainClass>
        </manifest>
      </archive>
    </configuration>
    <executions>
      <execution>
        <id>assemble-all</id>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
person Frischling    schedule 22.11.2018
comment
неправильный ответ, поскольку вопрос OP - это как раз тот факт, что mainClass здесь не записан в манифесте из-за того, что OP использует сборку в том же проекте, который сгенерировал jar. Итак, объявление нужно переместить в maven-jar-plugin. - person Walfrat; 21.06.2021

Если вы используете плагин maven shade для создания толстой банки (вместо или в дополнение к использованию плагина сборки), стоит отметить, что плагин shade обрабатывает входы в файл MANIFEST.MF немного иначе; см. страницу исполняемого jar-файла плагина shade.

person ryanbwork    schedule 20.04.2017

Вероятно, вам также потребуется добавить конфигурацию maven-jar-plugin и настроить там также MainClass. Сборка распаковывает все файлы JAR (например, jar проекта и jar зависимостей), и я думаю, что последний файл MANIFEST.MF, найденный в списке файлов JAR, «перезаписывает» ожидаемый / сгенерированный manifest.mf.

person mhaller    schedule 16.10.2011