как настроить <manifest>только один раз в pom.xml в настольном приложении - PullRequest
3 голосов
/ 14 сентября 2009

Я делаю свинг-приложение с maven и стараюсь держать pom.xml под узким натиском (этот файл, как правило, превращается в кучу мусора после вставки туда того, что мы находим в Google).

Мой pom с jar, и я использую плагин maven-assembly-с дескриптором "jar-with-dependencies". Поэтому мне нужно дважды определить часть моего проекта (основной класс и версии), один раз для обычного jar, а второй - для jar-with-dependencies.

Я думаю, что проблема связана с дескриптором сборки jar-with-dependencies, вместо распаковки обычного jar и слияния манифестов, он создает новый jar из $ {project.build.outputDirectory}, который пахнет странно для меня.

У кого-нибудь есть компактная и изящная идея избежать повторения моей манифестной конфигурации?

Спасибо, Николя.

1 Ответ

3 голосов
/ 14 сентября 2009

Вы можете настроить плагины Assembly и jar для использования [конкретного файла манифеста. Из раздела Создание исполняемого файла Jar документации по сборке:

Как вы, несомненно, заметили, плагин Assembly может быть очень полезным способом создания автономного двоичного артефакта для вашего проекта, среди многих других вещей. Однако, как только вы создали этот автономный jar-файл, вам, вероятно, понадобится возможность его выполнить с помощью ключа -jar JVM.

Для этого плагин Assembly поддерживает конфигурацию элемента, идентичную той, которая поддерживается maven-jar-plugin (см. Раздел Ресурсы). Используя эту конфигурацию, легко настроить атрибут Main-Class манифеста jar:

Обратите внимание, что указанный вами манифест объединен с созданным контентом. Со ссылочной страницы фляги:

Содержимое вашего собственного файла манифеста будет объединено с записями, созданными Maven Archiver. Если вы укажете запись в своем собственном файле манифеста, она переопределит значение, сгенерированное Maven Archiver.

Следующая конфигурация связывает выполнение сборки-плагина с фазой pre-integration-test (следующая фаза после пакета) и также включает в себя файл MANIFEST.MF, определенный в src / main / resources / META-INF.

Таким образом, следуя этому подходу, вы можете определить общее содержимое манифеста в вашем файле MANIFEST.MF и объединить его в окончательный манифест.

содержимое src / main / resources / META-INF / MANIFEST.MF

Created-By: Me
Foo: bar
Main-Class: com.foo.bar.MyMainClass
Bundle-Version: 4.0.0

Обновление: Основываясь на комментариях об использовании addDefaultSpecificationEntries , предложенный подход будет работать в сочетании с этой спецификацией для jar, созданного плагином jar. Однако похоже, что плагин сборки еще не поддерживает объединение дополнительных объявлений . Плагин jar объединяет манифест из src / main / resources с дополнительно указанными значениями для предоставления этого содержимого в моем тестовом проекте:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Me
Built-By: Rich Seller
Build-Jdk: 1.5.0_15
Specification-Title: Unnamed - org.test:test:jar:1.0.0
Specification-Version: 1.0.0
Implementation-Title: Unnamed - org.test:test:jar:1.0.0
Implementation-Version: 1.0.0
Implementation-Vendor-Id: org.test
Foo: bar
Main-Class: com.foo.bar.MyMainClass
Bundle-Version: 4.0.0

Принимая во внимание, что выход из сборки-плагина:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Me
Foo: bar
Main-Class: com.foo.bar.MyMainClass
Bundle-Version: 4.0.0

конфиг:

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <executions>
    <execution>
      <id>jar-with-deps</id>
      <phase>pre-integration-test</phase>
      <goals>
        <goal>single</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <descriptorRefs>
      <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
    <archive>
      <manifestFile>${manifest.file}</manifestFile>
      <!--these properties are ignored-->
      <manifest>
        <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
        <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
      </manifest>
    </archive>
  </configuration>
</plugin>
<plugin>
  <artifactId>maven-jar-plugin</artifactId>
  <version>2.2</version>
  <configuration>
    <archive>
      <manifestFile>${manifest.file}</manifestFile>
      <manifest>
        <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
        <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
      </manifest>
    </archive>
  </configuration>
</plugin>
...
<properties>
  <manifest.file>src/main/resources/META-INF/MANIFEST.MF</manifest.file>
</properties>
...