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] ------------------------------------------------------------------------
Другие вопросы по тегам