файлы из разных maven-модулей с одинаковым именем не могут сосуществовать в jar-файле, созданном с помощью плагина сборки maven

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

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

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

РЕДАКТИРОВАТЬ: у меня есть пользовательский дескриптор Assembly-Descriptor, который я хотел бы сохранить, даже если я начну использовать другой плагин. Этот дескриптор в основном исключает все языки, кроме английского, для ресурсов и текстов ошибок.

<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>

person leif_good    schedule 06.04.2016    source источник


Ответы (2)


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

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


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

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

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

<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>

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

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

<configuration>
    <filters>
        <filter>
            <artifact>*:*</artifact>
            <excludes>
                <exclude>**/*Resources_*</exclude>
                <exclude>**/*ErrorsText_*</exclude>
            </excludes>
        </filter>
    </filters>
</configuration>
person A_Di-Matteo    schedule 06.04.2016
comment
Я теряю возможность писать пользовательские дескрипторы Assembly с помощью плагина maven-shade? - person leif_good; 06.04.2016
comment
@replayleif, что настраивал ваш дескриптор сборки? можете ли вы добавить его к своему вопросу или, по крайней мере, к его соответствующей части? - person A_Di-Matteo; 06.04.2016
comment
@replayleif проверьте мое редактирование, я добавил необходимые указатели и пример того, как добиться того же - person A_Di-Matteo; 06.04.2016

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

<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>

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

Исключение в потоке "main" java.lang.SecurityException: неверный дайджест файла подписи для основных атрибутов манифеста

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

Если вам нужны дополнительные сведения, см. Выбор содержимого для JAR-файл Uber

person baron.wang    schedule 21.11.2016