如何使用 Maven 3 "exclude" 嵌入到 uber-jar 中的依赖项?
How to "exclude" dependencies embedded in an uber-jar using Maven 3?
我有一个项目 A
具有“托管依赖项”a
。 a
是一个“阴影罐”(uber-jar),其中有另一个依赖项 b
。问题是 b
重新定位到 a
的版本有几个 >7.5
CVE 反对它,我想将它从 CLASSPATH 中排除并使用 [=15= 的补丁版本] 解决了 CVE。
如何使用 Maven3 执行此操作?
编辑:附加上下文 a
是 htrace-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 仅存在于易受攻击的版本中总是存在风险,因此您可能会遇到棘手的运行时错误。
我有一个项目 A
具有“托管依赖项”a
。 a
是一个“阴影罐”(uber-jar),其中有另一个依赖项 b
。问题是 b
重新定位到 a
的版本有几个 >7.5
CVE 反对它,我想将它从 CLASSPATH 中排除并使用 [=15= 的补丁版本] 解决了 CVE。
如何使用 Maven3 执行此操作?
编辑:附加上下文 a
是 htrace-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 仅存在于易受攻击的版本中总是存在风险,因此您可能会遇到棘手的运行时错误。