#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 всегда будет вызывать боль… Единственный хороший вариант использования — создавать исполняемые банки … но не для зависимостей…