Maven Shaded Jar: изменить расположение выхода
У меня возникли трудности с использованием плагина Maven Shade, потому что я хотел бы, чтобы мой затененный jar был установлен в ту же папку, что и Parent pom (вместо локального src/target
каталог).
Макет: maven_project
guide/
parent_pom.xml
projA/
pom.xml
projB/
pom.xml
/target
original-projB-0.0.3.jar
projB-0.0.3.jar (shaded jar)
Я должен экспортировать проект, чтобы другим было проще запустить исполняемый файл. Я хочу переместить затененный файл в guide
папка.
К сожалению, я пытался использовать
<outputDirectory>/home/name/Desktop/maven_project/guide/</outputDirectory>
но это только переместило оригинальную флягу в каталог.
Вопрос: Есть идеи, как вместо этого переместить затененную банку (и даже удалить оригинальную банку в процессе)?
1 ответ
Плагин Maven Shade по умолчанию заменяет исходный файл jar, созданный при сборке, и создает его копию с префиксом оригинала.
Замена и перемещение могут быть настроены через outputDirectory
, outputFile
а также finalName
записи конфигурации.
Применение конфигурации ниже:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>default-jar</id>
<phase />
</execution>
</executions>
</plugin>
<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>
<finalName>${project.artifactId}-${project.version}-something</finalName>
<outputDirectory>../guide</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Мы:
- Во-первых, отключите генерацию jar по умолчанию, как того требуют ваши требования и указано в этой специальной SO Q/A
- Затем настройте плагин Shade, чтобы переместить его вывод в верхний
guide
папка (через относительный путь, лучший подход, также предложенный Tunaki) - Также настройка
finalName
элемент, чтобы отключить замену (что также влияет на перемещение, в том смысле, что будет перемещен также (с префиксом) исходный файл jar). Согласно официальной документации, finalNameНазвание затененного артефакта. Если вы хотите изменить имя нативного артефакта, вы можете использовать
<build><finalName>
установка. Если это установлено на что-то другое, чем<build><finalName>
, замена файла не будет выполнена, даже еслиshadedArtifactAttached
используется.
Таким образом, Maven будет генерировать только затененную банку в настроенном месте.
Другой подход заключается в использовании outputFile
запись конфигурации, которая указывает:
Путь к выходному файлу для затененного артефакта. Когда этот параметр установлен, созданный архив не заменит основной артефакт проекта и не будет прикреплен. Следовательно, этот параметр вызывает параметры
finalName
, shadedArtifactAttached,shadedClassifierName
а такжеcreateDependencyReducedPom
игнорироваться при использовании.
Следовательно, вы можете изменить конфигурацию выше:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>default-jar</id>
<phase />
</execution>
</executions>
</plugin>
<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>
<outputFile>../guide/${project.artifactId}-${project.version}-shaded.jar</outputFile>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
И вести себя точно так же.
Примечание: вы действительно меняете поведение сборки здесь. Если кто-то создаст только один модуль из самой папки модуля, он / она не найдет ожидаемый контент на target
папка, которая будет вместо родительской (немного неожиданно).
Обновить
Применяя приведенную выше конфигурацию и вызывая только Shade Plugin из командной строки
mvn shade:shade
Однако у вас возникнет следующая проблема:
[INFO] --- maven-shade-plugin:2.4.3:shade (default-cli) @ test-addjar ---
[ERROR] The project main artifact does not exist. This could have the following
[ERROR] reasons:
[ERROR] - You have invoked the goal directly from the command line. This is not
[ERROR] supported. Please add the goal to the default lifecycle via an
[ERROR] <execution> element in your POM and use "mvn package" to have it run.
[ERROR] - You have bound the goal to a lifecycle phase before "package". Please
[ERROR] remove this binding from your POM such that the goal will be run in
[ERROR] the proper phase.
[ERROR] - You removed the configuration of the maven-jar-plugin that produces the main artifact.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------