2016-04-06 9 views
5

Если есть два файла с разным контентом, но с тем же именем в два разных maven -модули, оба из которых объединены в один jar-файл с maven assembly-plugin, только один файл заканчивается тем, что является частью файла .jar.файлы из разных maven-модулей с тем же именем не могут сосуществовать в jar-файле, созданном с помощью maven assembly-plugin

Вопрос: Есть ли способ обеспечить, чтобы содержимое файлов было собрано в один файл при создании jar-файла?

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

EDIT: У меня есть пользовательский дескриптор сборки, который я хотел бы сохранить, даже если я начну использовать другой плагин. Этот дескриптор в основном исключает каждый язык, кроме английского, для ресурсов и текстов ошибок.

<id>jar-with-dependencies</id> 
<formats> 
    <format>jar</format> 
</formats> 
<includeBaseDirectory>false</includeBaseDirectory> 
<dependencySets> 
    <dependencySet> 
     <outputDirectory>/</outputDirectory> 
     <useProjectArtifact>true</useProjectArtifact> 
     <unpack>true</unpack> 
     <scope>runtime</scope> 
     <unpackOptions> 
      <excludes> 
       <exclude>**/*Resources_*</exclude> 
       <exclude>**/*ErrorsText_*</exclude> 
      </excludes> 
     </unpackOptions> 
    </dependencySet> 
</dependencySets> 

ответ

5

Как указано в документации maven-assembly-plugin:

Если ваш проект хочет упаковать ваш артефакт в убер-банке, сборка плагин предоставляет только базовую поддержку. Для большего контроля используйте Maven Shade Plugin.


Использование maven-shade-plugin вы можете иметь жир банку (например, с помощью плагина сборки) и решать подобные вопросы слияния файлов с использованием Resources transformers. В вашем случае AppendingTransformer объединит файлы с тем же именем, но с другим контентом.

Некоторые банки содержат дополнительные ресурсы (такие как файлы свойств), которые имеют одинаковое имя файла. Чтобы избежать перезаписи, вы можете выбрать их объединить, добавив их содержимое в один файл.

Простая конфигурация будет выглядеть следующим образом:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>2.4.3</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <transformers> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
           <resource>path/to/file/file-name-here</resource> 
          </transformer> 
         </transformers> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

Update
Вам не нужен внешний дескриптор сборки для плагина тени, вы можете настроить ваши требования непосредственно в качестве плагина конфигурации.
В вашем случае, чтобы исключить ресурсы из собранных банок, вы можете использовать shade filters.

Простая конфигурация (для объединения с приведенной выше) будет выглядеть следующим образом:

<configuration> 
    <filters> 
     <filter> 
      <artifact>*:*</artifact> 
      <excludes> 
       <exclude>**/*Resources_*</exclude> 
       <exclude>**/*ErrorsText_*</exclude> 
      </excludes> 
     </filter> 
    </filters> 
</configuration> 
+0

ли я потерять способность писать пользовательские Assembly-Descriptors с помощью maven-shade-plugin? – leimooo

+0

@replayleif, какова была ваша настройка дескриптора сборки? можете ли вы добавить его на свой вопрос или, по крайней мере, его соответствующую часть? –

+0

Запрошенная информация добавила к вопросу. – leimooo

0

также столкнулись с этой проблемой, моя потребность в том, чтобы отфильтровать файлы ресурсов одного и того же имени из модулей зависимостей, решение как ниже:

<plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>2.4.3</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <filters> 
          <filter> 
           <artifact>artifact1</artifact> 
           <excludes> 
            <exclude>application.yml</exclude> 
            <exclude>logging.yml</exclude> 
           </excludes> 
          </filter> 
          <filter> 
           <artifact>artifact2</artifact> 
           <excludes> 
            <exclude>application.yml</exclude> 
            <exclude>logging.yml</exclude> 
           </excludes> 
          </filter> 
          <filter> 
           <artifact>*:*</artifact> 
           <excludes> 
            <exclude>META-INF/*.SF</exclude> 
            <exclude>META-INF/*.DSA</exclude> 
            <exclude>META-INF/*.RSA</exclude> 
           </excludes> 
          </filter> 
         </filters> 
        </configuration> 
       </execution> 
      </executions> 
</plugin> 

примечание строки ниже, чтобы избежать возможного исключения:

Исключение в потоке «основного» java.lang.SecurityException: Invalid файл подписи дайджеста для Manifest главных атрибутов

<filter> 
      <artifact>*:*</artifact> 
      <excludes> 
       <exclude>META-INF/*.SF</exclude> 
       <exclude>META-INF/*.DSA</exclude> 
       <exclude>META-INF/*.RSA</exclude> 
      </excludes> 
</filter> 

В случае, если вы хотите более подробно, обратитесь к Selecting Contents for Uber JAR