简体   繁体   English

maven-shade-plugin:排除依赖项及其所有传递依赖项

[英]maven-shade-plugin: exclude a dependency and all its transitive dependencies

Using maven-shade-plugin , is there a way to exclude a dependency (which is not provided ) and all its transitive dependencies ?使用maven-shade-plugin ,有没有办法排除依赖项(未provided及其所有传递依赖项

For example :例如 :

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

    ... other dependencies

</dependencies>

and 1)和 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>

or 2)或 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>

Those don't work.那些不起作用。

All the transitive dependencies of com.example:some-artifact are added to the final jar. com.example:some-artifact所有传递依赖项都添加到最终的 jar 中。

Note that I don't want to set the scope of com.example:some-artifact to provided .请注意,我不想将com.example:some-artifact的范围设置为provided

Run "shade" from within a profile, and mark your dependency as provided only in that profile.从配置文件中运行“shade”,并将您的依赖项标记为仅在该配置文件中提供。 For example:例如:

<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>

When you run mvn -PshadeProfile package it will treat your dependency as provided (and thus omit its dependencies), and it will use the classifier "shaded" so you can use this as a dependency in other modules.当您运行mvn -PshadeProfile package它会将您的依赖项视为提供的(因此省略其依赖项),并且它将使用分类器“阴影”,因此您可以将其用作其他模块中的依赖项。

I tried following configuration, and it worked for me also:我尝试了以下配置,它也对我有用:

<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>

You must take in mind that by default all dependencies COMPILE will be included.您必须记住,默认情况下将包含所有依赖项 COMPILE。 But if you set artifacts in artifactSet includes, only those will be considered and the rest will be excluded (dependencies and its transitive dependencies)但是,如果您在 artifactSet 中设置了 artifacts 包含,则只会考虑那些,而其余的将被排除(依赖项及其传递依赖项)

Sometimes it's easier include only the dependencies you need than exclude all the rest.有时,只包含您需要的依赖项比排除所有其他依赖项更容易。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM