Как я могу использовать ранее созданные банки в многомодульном проекте maven?

У меня есть этот многомодульный проект maven:

ModuleA
  src
  pom.xml
  target
    ModuleA-with-dependencies-shaded.jar (version 4.1 of lucene relocated)
ModuleB
  src
  pom.xml
  target
    ModuleB-with-dependencies.jar (version 7.5.0 of lucene)
ModuleDist
  assembly
    all.xml
  pom.xml (shaded plugin for jar + assembly for Docker)

Плагины dist pom настроены следующим образом:

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.2</version>
                <configuration>
                    <shadedClassifierName>all</shadedClassifierName>
                    <shadedArtifactAttached>true</shadedArtifactAttached>
                    <transformers>
                        <!--remove models from jar see mitie -->
                        <transformer implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
                            <resource>.dat</resource>
                        </transformer>
                    </transformers>
                    <artifactSet>
                    <excludes>
                        <exclude>log4j:log4j:jar:</exclude>
                    </excludes>
                    </artifactSet>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <id>make-dist</id>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <descriptors>
                                <descriptor>src/assembly/all.xml</descriptor>
                            </descriptors>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

И сборка all.xml:

<assembly>
    <id>all</id>
    <formats>
        <format>dir</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <fileSets>
        <fileSet>
            <directory>${project.basedir}/src/main/docker</directory>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>*</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>${project.build.directory}</directory>
            <outputDirectory>lib</outputDirectory>
            <includes>
                <include>*.jar</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>

Поскольку ModuleA имеет транзитивную зависимость от lucene 4.1 (но перемещена, чтобы не конфликтовать с модулем B), а ModuleB имеет транзитивную зависимость от lucene 7.5.0, я хотел бы использовать ранее построенный и затененный jar ModuleA в затененном плагине maven ModuleDist (потому что, если я перемещаю lucene в ModuleDist, он перемещает все классы lucene).

Как я могу это сделать?
или есть другой способ сделать это?


person Bruno Thomas    schedule 04.03.2020    source источник
comment
Заштрихованную банку можно адресовать по тем же координатам, что и модуль, но нужно добавить <classifier>shaded</classifier>...   -  person khmarbaise    schedule 04.03.2020
comment
спасибо @khmarbaise, мы использовали другое имя классификатора, но это то, что мы сделали.   -  person Bruno Thomas    schedule 05.03.2020


Ответы (1)


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

<?xml version="1.0"?>
<assembly>
...
  <dependencySets>
    <dependencySet>
      <outputDirectory>/lib</outputDirectory>
       <unpack>false</unpack>
       <scope>runtime</scope>
    </dependencySet>
  </dependencySets>
</assembly>

Дополнительные сведения см. в документации подключаемого модуля сборки. Рабочий пример можно найти здесь (затенение не используется).

Мой личный опыт показывает, что лучше иметь только один последний модуль, который собирает все. Таким образом, шейдеру не нужно разбирать и собирать все снова и снова.

Затенение является большой проблемой при использовании Jackson и Log4j2, потому что оно ломает некоторые механизмы поиска расширений, которые ожидают, что все будет в отдельной банке. Я рекомендую не использовать его больше.

person s.fuhrm    schedule 04.03.2020
comment
Да, но тогда вы закончите с несколькими банками, которые могут быть загружены в разном порядке, и результатом будет разная функция порядка. Я хотел закончить с фиксированной банкой - person Bruno Thomas; 04.03.2020
comment
Это зависит от ваших предпочтений: порядок загрузки определяется путем к классам. Если у вас есть затененная банка, возможные коллизии будут «разрешены» шейдером (= обычно не разрешаются). Работает ли у вас часть dependencySets? - person s.fuhrm; 05.03.2020
comment
да, мы использовали набор зависимостей перед сборкой образа докера. Но поскольку нам нужно было удалить модели NLP и подготовить банку перед сборкой докера, мы решили использовать плагин тени, который сломал финальную банку. В итоге мы получили 2 сборки и соединили их в цепочку для окончательной папки докера. - person Bruno Thomas; 05.03.2020
comment
Хорошо :)! Если это решило вашу проблему, было бы неплохо, если бы вы отметили вопрос как решенный. - person s.fuhrm; 05.03.2020
comment
дело не в том, чтобы сделать сборку, которая решила проблему (как я уже говорил, мы делали это до того, как пришлось собирать сборку докера), а в том, чтобы сделать две сборки, причем вторая берет результаты предыдущей. Я проголосовал за ваш ответ, но я объясню, что мы сделали, в другом посте. - person Bruno Thomas; 06.03.2020