首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Maven 3“排除”嵌入在uber-jar中的依赖关系?

如何使用Maven 3“排除”嵌入在uber-jar中的依赖关系?
EN

Stack Overflow用户
提问于 2021-01-22 22:06:02
回答 1查看 893关注 0票数 2

我有一个项目A,它有一个“托管依赖”aa是一个“阴影jar”(uber-jar),它将另一个依赖项b重新定位在其中。问题是,迁移到a中的a版本有几个>7.5 CVE针对它的文件,我想将它排除在CLASSPATH之外,并使用带有>7.5地址的修补版本的b

我如何使用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“托管依赖”策略。

代码语言:javascript
复制
❯ 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] ------------------------------------------------------------------------
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-22 22:28:51

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

听起来就像一种情况,你正试图解决一些完全错误的事情。从概念上讲,依赖于已经合并了特定版本的依赖类的东西显然是一个潜在的噩梦,尤其是您已经发现,如果存在针对这些阴影依赖项之一的CVEs。依赖于uber-jar,本质上破坏了依赖关系管理模型。

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

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

下面是一个示例--在默认- jar由maven-jar插件构建之前,将不带auth包的依赖包解压缩到目标的类目录中,然后我必须排除原始的jar--这是一个spring-boot项目,所以我使用了spring-boot插件配置,这是在repackage目标期间使用的,如果您使用的是war插件,我怀疑有类似的排除功能。

最终的结果是从我的jar类目录中的http客户端过滤下来的类,与我的应用程序类一起。

代码语言:javascript
复制
            <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 4,您可以轻松地包含所有htrace类,而无需使用jackson数据库阴影类。

代码语言:javascript
复制
            <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-cubating.jar,如果您有一个spring引导应用程序,您可以像我这样做,或者在创建war文件或使用任何插件创建最终构建时使用maven war插件。在解压缩过程中,您还可能希望排除jar文件中的一些pom.xml文件,这些文件并不是您真正需要的。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65853369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档