Плагин Maven shade не исключает файлы сигнатур манифеста

Я использую плагин maven shade для создания консолидированной банки для моего проекта. Ящик генерируется так, как ожидалось, и когда я пытаюсь использовать банку и запускаю ее, я получаю

java.lang.SecurityException: Недопустимый дайджест файла подписи для Ошибка манифеста основных атрибутов.

Я просмотрел вышеуказанное сообщение об ошибке, и многие люди предложили исключить сигнатуры манифеста из каталога META-INF. Таким образом, я включил шаг для исключения этих файлов из каталога [я вижу два файла по имени JARSIGN_.RSA и JARSIGN_.SF], но по какой-то странной причине плагин maven shade не может исключить эти файлы из META-INF каталог. Может ли кто-нибудь объяснить мне, что я могу делать неправильно? Мой pom.xml находится ниже, и команда, которую я использую для создания флага, такова:

mvn clean package shade:shade

pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>

        <groupId>com.abc.xyz</groupId>
        <artifactId>myjar</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>jar</packaging>
        <url>http://maven.apache.org</url>

        <properties>
            <!-- A few custom properties -->
        </properties>


        <dependencies>
            <dependency>
                <groupId>com.google.code.gson</groupId>
                <artifactId>gson</artifactId>
                <version>2.3.1</version>
            </dependency>
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>18.0</version>
            </dependency>
        <!-- Other The dependencies are here -->
        </dependencies>

        <repositories>
            <!-- Repository Information -->
        </repositories>
        <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <version>2.3.2</version>
                        <configuration>
                            <source>1.8</source>
                            <target>1.8</target>
                            <encoding>UTF-8</encoding>
                        </configuration>
                    </plugin>
                    <!-- Maven Shade Plugin -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-shade-plugin</artifactId>
                        <version>2.4.2</version>
                        <executions>
                            <!-- Run shade goal on package phase -->
                            <execution>
                                <phase>package</phase>
                                <goals>
                                    <goal>shade</goal>
                                </goals>
                                <configuration>
                                    <filters>
                                        <filter>
                                            <artifact>*:*</artifact>
<!-- The below statement is not executed by shade plugin -->
                                            <excludes>
                                                <exclude>META-INF/*.SF</exclude>
                                                <exclude>META-INF/*.DSA</exclude>
                                                <exclude>META-INF/*.RSA</exclude>
                                            </excludes>
                                        </filter>
                                    </filters>                          
                                    <minimizeJar>true</minimizeJar>
                                    <artifactSet>
                                        <includes>
                                            <include>com.google.guava:guava</include>
                                            <include>com.google.code.gson:gson</include>
                                        </includes>
                                    </artifactSet>
                                    <transformers>
                                        <!-- add Main-Class to manifest file -->
                                        <transformer
                                            implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                            <manifestEntries>
                                                <Main-Class>com.abc.xyz.HelloWorld</Main-Class>
                                            </manifestEntries>
                                        </transformer>
                                    </transformers>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
        </build>
    </project>

Ответ 1

Возможно, синтаксис конфигурации для плагина изменился, но в прошлом это работало для меня с версией 1.5 плагина шейдера:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>1.5</version>
    <configuration>
        <transformers>
            <transformer implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
                <resource>META-INF/JARSIGN_.SF</resource>
            </transformer>
        </transformers>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Я не пытался использовать подстановочные знаки. Но, глядя на документацию, следует исключить все .SF файлы:

<resource>.SF</resource>

Смотрите этот поток для другого примера.

Ответ 2

С плагином Shade 3.2.1 у меня работает следующее.

<!-- language: lang-xml -->
<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <filters>
                        <filter>
                            <artifact>*:*</artifact>
                            <excludes>
                                <exclude>META-INF/*.SF</exclude>
                                <exclude>META-INF/*.DSA</exclude>
                                <exclude>META-INF/*.RSA</exclude>
                            </excludes>
                        </filter>
                    </filters>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

На странице документа плагина (https://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html) весь тег <configuration> отображается внутри тега <execution>. Это не работает. Блок <configuration> должен находиться за пределами тега <executions>, как показано выше.

Ответ 3

У меня была похожая проблема, когда плагин Shade, по-видимому, не исключал файлы из каталога META-INF, независимо от того, какие настройки я пробовал. Я проверял это с помощью следующих команд bash:

mvn clean install
7za x target/built-jar-6.4.0.jar -aoa -o/tmp/unpacked/
ls /tmp/unpacked/META-INF/

Проблема на самом деле была не в самом плагине shade, а в том, как я распаковывал JAR - команда распаковки перезаписывает файлы, но сохраняет старые файлы на месте, заставляя меня думать, что что-то не так с моими настройками.