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