Принудительный жизненный цикл Maven для модуля проекта

#maven #maven-shade-plugin

#maven #maven-shade-плагин

Вопрос:

Я использую org.apache.maven.plugins:maven-shade-plugin:3.2.4 для создания одного файла JAR, который содержит все основные зависимости моего (многомодульного) проекта. Оттуда я делаю этот модуль зависимостью для всех моих других модулей. Это позволяет мне иметь одно место для определения всех основных зависимостей и только одну конфигурацию перемещения плагина shade, вместо того, чтобы копировать и вставлять одну и ту же информацию о плагине shade в каждый модуль, который все хотят одинаково затенять зависимости.

Однако проблема в том, что плагин shade-plugin не запускается до фазы пакета. Итак, если я запускаю только mvn test проект, не удается скомпилировать, потому что эти основные зависимости не собираются, не затеняются, не перемещаются до package фазы.

Есть ли способ, которым я могу определить в POM способ, который всегда будет запускать этот один модуль до фазы пакета независимо от mvn фазы, указанной в каталоге верхнего уровня?

К вашему сведению: Guava 27.0-jre

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <parent>
    <artifactId>app</artifactId>
    <groupId>org.my.app</groupId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <artifactId>app-thirdparty</artifactId>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-shade-plugin</artifactId>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <relocations>
                <relocation>
                  <pattern>com.google</pattern>
                  <shadedPattern>org.my.app.thirdparty.com.google</shadedPattern>
                </relocation>
                <relocation>
                  <pattern>org.checkerframework</pattern>
                  <shadedPattern>org.my.app.thirdparty.org.checkerframework</shadedPattern>
                </relocation>
                <relocation>
                  <pattern>org.codehaus</pattern>
                  <shadedPattern>org.my.app.thirdparty.org.codehaus</shadedPattern>
                </relocation>
              </relocations>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
 

Комментарии:

1. Использование затененного jar в качестве зависимости обычно является плохой идеей, поскольку вы теряете все возможности для исключения зависимостей с помощью механизма исключения im Maven.

2. Справедливое замечание. Однако, поскольку это мой собственный внутренний JAR проекта, и я могу контролировать то, что в нем существует, я не хочу ничего исключать.

3. Да, верно, но вы просто указываете зависимость этого проекта / модуля, и у вас есть то, что вам нужно. Для этого нет необходимости создавать затененную банку. Зависимости, которые вы определили в своем pom, также будут доступны в вашем проекте, использующем этот модуль. Путь к классу автоматически обрабатывается Maven, и вы бы согласились с соглашением вместо того, чтобы пытаться обойти вещи, которые на самом деле не являются проблемой … в конце концов, затененный jar всегда будет вызывать боль… Единственный хороший вариант использования — создавать исполняемые банки … но не для зависимостей…