Maven «затененный» JAR с префиксом «оригинал» в имени файла - PullRequest
34 голосов
/ 03 ноября 2010

Я использую плагин "shade" Maven2 для создания монолитного 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>

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

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

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

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

Ответы [ 3 ]

48 голосов
/ 02 января 2012

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

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

<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>jar-with-dependencies</shadedClassifierName>
20 голосов
/ 03 ноября 2010

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

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

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

7 голосов
/ 23 января 2013

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...