如何使用 Maven 3 "exclude" 嵌入到 uber-jar 中的依赖项?

How to "exclude" dependencies embedded in an uber-jar using Maven 3?

我有一个项目 A 具有“托管依赖项”aa 是一个“阴影罐”(uber-jar),其中有另一个依赖项 b。问题是 b 重新定位到 a 的版本有几个 >7.5 CVE 反对它,我想将它从 CLASSPATH 中排除并使用 [=15= 的补丁版本] 解决了 CVE。

如何使用 Maven3 执行此操作?

编辑:附加上下文 ahtrace-core4:4.0.1-incubating hadoop-common:2.8.3 的传递依赖。 htrace-core4:4.0.1-incubating 不再受支持,当然包含易受攻击的 jackson-databind:2.4.0 阴影 jar(b 为了我上面的标签),它已被证明对正常的 maven“托管依赖”策略具有弹性。

❯ mvn dependency:tree -Dincludes="org.apache.htrace*"          
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------< com.s****m.**:s****s >-------------------------
[INFO] Building s*****s 1.21.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:3.0.2:tree (default-cli) @ s****s ---
[INFO] com.s****m.**:s****s:jar:1.0.0-SNAPSHOT
[INFO] \- org.apache.hadoop:hadoop-client:jar:2.8.3:compile
[INFO]    \- org.apache.hadoop:hadoop-common:jar:2.8.3:compile
[INFO]       \- org.apache.htrace:htrace-core4:jar:4.0.1-incubating:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.676 s
[INFO] Finished at: 2020-04-27T11:57:11-03:00
[INFO] ------------------------------------------------------------------------

我有一个疑问,如果你有任何可行的选择,你是否应该这样做。

听起来像是您正在尝试解决错误的情况。从概念上讲,依赖于包含特定版本依赖项 classes 的内容显然是一个潜在的噩梦,尤其是当您发现是否针对这些阴影依赖项之一识别出 CVE 时。依赖 uber-jar 本质上打破了依赖管理模型。

我猜它是在您的组织内部创建的,而不是来自中央存储库,所以您可以向该团队施加压力以做正确的事情吗?

或者,依赖插件的解包可能是一个选项 - 将基于包的排除项解包到你的构建中 - https://maven.apache.org/plugins/maven-dependency-plugin/usage.html#dependency:unpack

以我为例-在maven-jar插件构建default-jar之前,将没有auth包的依赖项解压到目标的classes目录中,然后我必须排除原始 jar - 这是一个 spring-boot 项目,所以我使用 spring-boot 插件配置,如果你使用 war 插件,我会在重新打包目标期间使用它怀疑有类似的排除能力。

最终结果是从我的 jar classes 目录以及我的应用程序 classes.

中的 http 客户端过滤下来的 classes
            <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>3.1.2</version>
            <executions>
                <execution>
                    <id>default-jar</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>unpack</goal>
                    </goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>org.apache.httpcomponents</groupId>
                                <artifactId>httpclient</artifactId>
                                <outputDirectory>${project.build.directory}/classes</outputDirectory>
                                <excludes>org/apache/http/auth/</excludes>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>

            <excludes>
                <exclude>
                    <groupId>org.apache.httpcomponents</groupId>
                    <artifactId>httpclient</artifactId>
                </exclude>
            </excludes>
            </configuration>
        </plugin>

请注意,自从问题更新后,我查看了 htrace-core-4,您可以轻松地包含所有 htrace classes,而无需 jackson 数据绑定阴影 classes 使用

            <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>3.1.2</version>
            <executions>
                <execution>
                    <id>default-jar</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>unpack</goal>
                    </goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>org.apache.htrace</groupId>
                                <artifactId>htrace-core4</artifactId>
                                <outputDirectory>${project.build.directory}/classes</outputDirectory>
                                <excludes>org/apache/htrace/fasterxml/</excludes>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>

然后你只需要排除原始的 htrace-core4-4.0.1-incubating.jar,如果你有 spring-boot 应用程序,你可以像我一样做,或者如果您正在创建 war 文件或使用任何插件创建您的最终构建,则使用 maven war 插件。在解压过程中,您可能还想排除 jar 文件中您并不真正需要的一些 pom.xml 文件。

同时添加对安全版本的 jackson-databind 的依赖,尽管 htrace 使用的方法或 class 仅存在于易受攻击的版本中总是存在风险,因此您可能会遇到棘手的运行时错误。