Подтвердить что ты не робот

Maven "shaded" JAR имеет префикс "оригинал" в имени файла

Я использую плагин Maven2 "shade" для создания монолитного JAR со всеми связанными Java-зависимостями. Соответствующий раздел в pom.xml довольно прост:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>1.4</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <finalName>${project.artifactId}-${project.version}-SHADED</finalName>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>com.mypackage.MyClass</mainClass>
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

Однако результаты сборки нечетны. Кажется, что TWO файлы фактически созданы этим плагином Maven:

myartifact-1.0.0-SHADED.jar  (zero bytes)
original-myartifact-1.0.0-SHADED.jar  (10 MB)

Файл JAR с префиксом "оригинал" правильно построен и отлично функционирует. Полагаю, я мог бы просто переименовать его, чтобы снять этот префикс, и по-прежнему весело.

Однако мне очень любопытно, что может происходить здесь с плагином "тени". Похоже, что "оригинальный" файл - это временное рабочее место, которое должно быть переименовано в конце процесса, и что окончательное переименование просто не завершено. Там нет очевидных объяснений, хотя (т.е. Разрешения файловой системы и т.д.). Кто-нибудь когда-либо видел это раньше?

4b9b3361

Ответ 1

Шаги сборки Maven создадут jar target/artifact-version.jar.

Затем запускается теневой плагин. Он обычно переименовывает эту банку в target/original-artifact-version.jar и дает заштрихованному JAR имя target/artifact-version.jar.

Однако вы настраиваете плагин Shade для использования другого имени. Если у вас нет веской причины, я удалю <finalName> из вашей конфигурации и буду жить с тем, что хочет дать вам плагин Shade.

Ответ 2

Я знаю, что этот вопрос старый, но подумал, что стоит добавить следующую информацию.

Я думаю, что результат, изначально желаемый Стивом, представлен на этой странице документации maven-shade-plugin.

<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>jar-with-dependencies</shadedClassifierName>

Ответ 3

Следуя @Stewart за предоставление немного лучшего ответа (без обид: D):

Причина, по которой вы получаете исходный * беспорядок, может быть двоякой:

  • Задание <finalName> означает, что вы хотите, чтобы имя отличалось от того, что Maven дает вам по умолчанию (то есть: то же, что и имя артефакта: artifactId-version.jar или artifactId-version-shaded.jar). Если вы укажете окончательное имя, то же самое, что и одно из двух, оно попытается вернуть старый, как оригинальный - *. Jar, а затем перезаписать его новым затененным. В вашем случае вы говорите ему, чтобы сделать окончательный JAR * -shaded.jar, который уже имеет место, когда он выходит из Maven (прежде чем они по умолчанию превращают его в artifactId-version.jar), поэтому он сначала поддерживает старую *-shaded.jar как original-*-shaded.jar, а затем ошибки при записи байтов в новый *-shaded.jar, если старый исчез (они, похоже, переименовали его).

  • (Это был мой случай) Используя <shadedClassifierName>, который изменяет только суффикс, используемый Maven для генерации * -shaded.jar, в сочетании с <finalName> также может давать те же результаты. Если вы хотите, вы можете просто использовать <shadedClassifierName> и указать другой суффикс и сделать с ним, не указывая <finalName> на все. В моем случае я установил оба вывода, чтобы назвать вывод одним и тем же: ie: artifactId-version-all.jar, но используя 'all', поскольку Classifier вернул меня к сценарию, описанному в # 1.