Плагин сборки Maven не устанавливает настройки манифеста MainClass - PullRequest
15 голосов
/ 16 октября 2011

У меня есть проект maven, который генерирует jar с помощью подключаемого модуля 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 в банке, сгенерированной mvn package. Сгенерированный манифест ниже:

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

Что я делаю не так?

Ответы [ 4 ]

13 голосов
/ 16 октября 2011

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

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

1 голос
/ 21 апреля 2017

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

0 голосов
/ 22 ноября 2018

Для фанатов копирования и вставки, таких как я, ответ собранных сверху, и 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>
0 голосов
/ 16 октября 2011

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

...