【问题标题】:maven-shade-plugin: exclude a dependency and all its transitive dependenciesmaven-shade-plugin:排除依赖及其所有传递依赖
【发布时间】:2015-04-12 01:01:44
【问题描述】:

使用maven-shade-plugin,有没有办法排除依赖项(不是provided及其所有传递依赖项

例如:

<dependencies>
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>some-artifact</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </dependency>

    ... other dependencies

</dependencies>

和 1)

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <artifactSet>
                    <includes>
                        <include>*:*</include>
                    </includes>
                    <excludes>
                        <exclude>com.example:some-artifact</exclude>
                    </excludes>
                </artifactSet>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

或 2)

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <artifactSet>
                    <includes>
                        <include>*:*</include>
                    </includes>
                </artifactSet>
                <filters>
                    <filter>
                        <artifact>com.example:some-artifact</artifact>
                        <excludes>
                            <exclude>**</exclude>
                        </excludes>
                    </filter>
                </filters>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

那些不起作用。

com.example:some-artifact 的所有传递依赖都添加到最终的 jar 中。

请注意,我不想将com.example:some-artifact 的范围设置为provided

【问题讨论】:

    标签: java maven maven-shade-plugin


    【解决方案1】:

    从配置文件中运行“阴影”,并将您的依赖项标记为仅在该配置文件中提供。例如:

    <profiles>
        <profile>
            <id>shadeProfile</id>
            <dependencies>
                <dependency>
                    <groupId>com.example</groupId>
                    <artifactId>some-artifact</artifactId>
                    <version>1.23</version>
                    <scope>provided</scope>
                </dependency>
            </dependencies>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-shade-plugin</artifactId>
                        <version>2.3</version>
                        <executions>
                            <execution>
                                <phase>package</phase>
                                <goals>
                                    <goal>shade</goal>
                                </goals>
                                <configuration>
                                    <shadedClassifierName>shaded</shadedClassifierName>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
    

    当您运行 mvn -PshadeProfile package 时,它会将您的依赖项视为已提供(因此忽略其依赖项),并且它将使用“阴影”分类器,因此您可以将其用作其他模块中的依赖项。

    【讨论】:

    • 重要的是要知道,如果您对“某些工件”的传递依赖项之一具有未提供的依赖项(甚至是传递依赖项),那么该工件将包含在阴影中插入。因此,有时这种解决方案无法达到预期的效果。
    【解决方案2】:

    我尝试了以下配置,它也对我有用:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.1.0</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <finalName>client-${artifactId}</finalName>
            <filters>
                <filter>
                    <artifact>*:*</artifact>
                    <excludes>
                        <exclude>META-INF/*</exclude>
                    </excludes>
                </filter>
            </filters>
            <artifactSet>
                <excludes>
                    <exclude>org.apache.jmeter:*</exclude>
                    <exclude>com.fasterxml.jackson.core:jackson-databind:*</exclude>
                    <exclude>com.fasterxml.jackson.module:jackson-module-scala_2.11:*</exclude>
                </excludes>
            </artifactSet>
        </configuration>
    </plugin>
    

    【讨论】:

      【解决方案3】:

      您必须记住,默认情况下,所有依赖项 COMPILE 都将包括在内。但是,如果您在 artifactSet 中设置了工件包含,则只会考虑那些,其余的将被排除(依赖及其传递依赖)

      有时只包含您需要的依赖项比排除所有其他依赖项更容易。

      【讨论】:

        猜你喜欢
        • 2018-07-06
        • 2019-10-29
        • 2021-10-24
        • 1970-01-01
        • 2010-11-08
        • 2016-04-20
        • 2010-10-07
        • 1970-01-01
        相关资源
        最近更新 更多