2016-11-02 8 views
0

У меня есть проект, который производит три фляга файлов:Maven: Три банки в одном проекте. Попытка использовать сборку, но не получает pom.xml и pom.properties внедренный в банках

  • server.jar: Это содержит все классы и ресурсы. Стандартная баночка
  • Client.jar: Это содержит только несколько внешних классов и ресурсов.
  • ServerSDK.jar: содержит все классы, ресурсы, классы тестов и другие файлы конфигурации.

Я решил сделать все три банки в одном проекте, поэтому изменение в любом из источников порождает сборку Дженкинса и развертывает все три одновременно. Я строю Server.jar как мой стандартный pom.xml jar. Затем я использую сборки для сборки Client.jar и ServerSDK.jar.

У меня есть сборки, которые строят два других баночки, и все это 99% от того, как мне это нравится, но я хочу немного потрудиться.

  1. Мы добавили несколько записей в наш файл MANIFEST.MF, чтобы включить информацию о конструкции Jenkins и информацию о проекте.
  2. В стандартной коробке Maven pom.xml и pom.properties встроены в каталог META-INF.

Первый, который мне удалось сделать через конфигурацию <assembly> в моем maven-assembly-plugin. Второй, который, похоже, не работает, хотя у меня есть <addMavenDescriptor>, установленный в true в моей конфигурации <assembly>.

Вот мой maven-assembly-plugin раздел в моем pom.xml

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.6</version> 
    <configuration> 
     <archive> 
      <addMavenDescriptor>true</addMavenDescriptor> 
      <manifestSections> 
       <manifestSection> 
        <name>Build-Information</name> 
        <manifestEntries> 
         <Project-Name>${env.JOB_NAME}</Project-Name> 
         <Build-Number>${env.BUILD_NUMBER}</Build-Number> 
         <SVN-Revision>${env.SVN_REVISION}</SVN-Revision> 
        </manifestEntries> 
       </manifestSection> 
       <manifestSection> 
        <name>Module-Information</name> 
        <manifestEntries> 
         <Group-ID>${project.groupId}</Group-ID> 
         <Artifact-ID>${project.artifactId}</Artifact-ID> 
         <Version>${project.version}</Version> 
        </manifestEntries> 
       </manifestSection> 
      </manifestSections> 
     </archive> 
    </configuration> 
    <executions> 
     <execution> 
      <id>Client</id> 
      <configuration> 
       <finalName>Client</finalName> 
       <appendAssemblyId>true</appendAssemblyId> 
       <descriptors> 
        <descriptor>src/assembly/client.xml</descriptor> 
       </descriptors> 
      </configuration> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

The <manifestSections> работы просто отлично, но не похоже, работает ли <addMavenDescriptor> хотя я явно установить его true.

Согласно документации на maven-archiver-plugin:

ли созданный архив будет содержать эти два Maven файла:

  • Файл POM, расположенные в архиве в META-INF/maven/${groupId}/${artifactId}/pom.xml
  • pom.properties файл, находящийся в архиве в формате META-INF/maven/${groupId}/${artifactId}/pom.properties

Значение по умолчанию: true.

Согласовывающ maven-assembly-plugin страницы:

<archive>
Это набор инструкций для архива строителя, особенно для создания .jar файлов.Он позволяет указать файл манифеста для банки в дополнение к другим параметрам. См. Maven Archiver Reference

Есть ли что-то простое, что я здесь отсутствует?

+0

Хм, ваша конфигурация выглядит правильно на первый взгляд. Я попытаюсь воспроизвести что-то. Обратите внимание, что вместо того, чтобы иметь одно проектное здание 3 JAR, было бы предпочтительнее разделить его на 3 модуля многомодульного проекта Maven. Таким образом, вы по-прежнему сохраняете свое требование о создании и развертывании всего этого в Jenkins, когда изменения происходят в любом из модулей, и это рекомендуемый подход Maven здесь. Затем вы можете добавить 4-й модуль, делающий окончательную сборку. – Tunaki

+0

Я всегда думал о модулях, как компиляцию их собственных файлов классов - как уха или войны. Здесь все три банка используют одни и те же файлы классов. Двое из них используют все из них, а один использует подмножество. Мне нужно будет снова прочитать модули и посмотреть, как это делается. –

ответ

0

Плагин сборки Maven фактически игнорирует параметр addMavenDescriptor и никогда не будет включать дескриптор Maven в результирующую сборку. Это можно увидеть in the source code: в архив JAR возможно добавить только файл META-INF/MANIFEST.MF.

Я не мог найти существующий вопрос JIRA об этом, поэтому я пошел и создал MASSEMBLY-835, чтобы отслеживать это.


обходным сейчас бы добавить файлы себя в дескрипторе сборки:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd"> 
    <id>client</id> 
    <formats> 
    <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <files> 
    <file> 
     <source>pom.xml</source> 
     <outputDirectory>META-INF/maven/${project.groupId}/${project.artifactId}</outputDirectory> 
    </file> 
    <file> 
     <source>${project.build.directory}/maven-archiver/pom.properties</source> 
     <outputDirectory>META-INF/maven/${project.groupId}/${project.artifactId}</outputDirectory> 
    </file> 
    </files> 
    <!-- rest of your configuration --> 
</assembly> 

Это добавляет конфигурацию <files>, которая добавляет pom.xml и сгенерированный pom.properties в целевой каталог.

Отметьте, что pom.properties генерируется компонентом Maven Archiver во время цели по умолчанию into the target/maven-archiver directory; поэтому для того, чтобы он присутствовал при создании сборки, плагин Assembly должен быть привязан к фазе package (или позже в жизненном цикле), а текущий проект Maven должен быть из упаковки JAR/WAR/EAR/EJB/RAR ... но не POM, который не упаковывает архив. Необходимо также создать первичный артефакт проекта Maven (если вы пропустите генерацию основного JAR проекта JAR, то pom.properties не будет создан).

Это работает в подавляющем большинстве случаев. Но если вы хотите пуленепробиваемое решение, вы можете просто создать файл самостоятельно. Создать pom.properties где-то в вашем проекте (пример, базовый каталог) со следующим содержанием:

#Generated by Apache Maven ${maven.version} 
version=${project.version} 
groupId=${project.groupId} 
artifactId=${project.artifactId} 

и в предыдущем дескрипторе сборки, имеет вместо:

<file> 
    <source>pom.properties</source> 
    <outputDirectory>META-INF/maven/${project.groupId}/${project.artifactId}</outputDirectory> 
    <filtered>true</filtered> 
</file> 

Это правильно заменить заполнители внутри pom.properties, который был создан и имитирует то, что сделает Maven Archiver.

+0

Спасибо. Я подозревал, что это может быть так, но на самом деле я не разработчик Java, я бы не стал на 100% уверенным в чтении кода. Я решил спросить, что StackOverflow либо подтвердит, что это ошибка, либо (более вероятно), я не знаю, что я делаю. Я все еще играю с этим. Я понимаю, что для указания этих двух других банок вам понадобится '' (что также объясняет, почему, если у меня нет '', Maven выбрасывает подходящее. Спасибо. –

+0

@DavidW. В этом случае, это ошибка :). Я взгляну на его исправление, и это, вероятно, будет включено в следующий выпуск 3.0.0 плагина. – Tunaki