gpt4 book ai didi

java - maven-shade-plugin 的用途是什么,为什么要重新定位 Java 包?

转载 作者:bug小助手 更新时间:2023-10-28 10:39:48 25 4
gpt4 key购买 nike

我发现有人在 pom.xml 中使用了 maven-shade-plugin。我以前从未使用过 maven-shade-plugin(我是 Maven n00b),所以我试图了解使用它的原因以及它的作用。

我看了Maven docs ,但是我无法理解此声明:

This plugin provides the capability to package the artifact in an uber-jar, including its dependencies and to shade - i.e. rename - the packages of some of the dependencies.

页面上的文档似乎对新手不太友好。

什么是“ super jar ”?为什么有人想做一个?重命名依赖项的包有什么意义?我试图浏览 maven-shade-plugin apache 页面上的示例,例如“为 Uber Jar 选择内容”,但我仍然无法理解“着色”正在完成什么。

任何指向说明性示例/用例的指针(解释为什么在这种情况下需要阴影 - 它解决了什么问题)将不胜感激。最后,什么时候应该使用 maven-shade-plugin?

最佳答案

Uber JAR,简而言之,就是一个包含一切的 JAR。

通常在 Maven 中,我们依赖依赖管理。 Artifact 仅包含其自身的类/资源。 Maven 将负责找出项目所依赖的所有 Artifact (JAR 等)。

一个 uber-jar 是一种获取所有依赖项的东西,并提取依赖项的内容并将它们与项目本身的类/资源一起放在一个大 JAR 中。通过拥有这样一个 uber-jar,执行起来很容易,因为您只需要一个大 JAR 而不是大量的小 JAR 来运行您的应用程序。在某些情况下,它还可以简化分发。

附带说明:避免使用 uber-jar 作为 Maven 依赖项,因为它会破坏 Maven 的依赖项解析功能。通常我们只为最终 Artifact 创建一个 uber-jar 用于实际部署或手动分发,而不是用于放入 Maven 存储库。


更新:我刚刚发现我还没有回答问题的一部分:“重命名依赖项的包有什么意义?”。以下是一些简短的更新,希望能对有类似问题的人有所帮助。

创建一个易于部署的 uber-jar 是 shade 插件的一个用例。还有其他涉及包重命名的常见用例。

例如,我正在开发 Foo 库,它依赖于 Bar 库的特定版本(例如 1.0)。假设我无法使用其他版本的 Bar lib(因为 API 更改或其他技术问题等)。如果我在 Maven 中简单地将 Bar:1.0 声明为 Foo 的依赖项,则可能会遇到问题: Qux 项目依赖在 Foo 上,还有 Bar:2.0 (它不能使用 Bar:1.0 因为 Qux 需要使用 new Bar:2.0 中的功能)。这是两难的选择:Qux 应该使用 Bar:1.0(其中 Qux 的代码不起作用)还是 Bar:2.0(哪个Foo的代码不起作用)?

为了解决这个问题,Foo的开发者可以选择使用shade插件来重命名Bar的用法,这样Bar中的所有类: 1.0 jar嵌入在Foo jar中,嵌入的Bar类的包由com.bar改为com.foo.bar。通过这样做,Qux 可以安全地依赖于 Bar:2.0,因为现在 Foo 不再依赖于 Bar,它正在使用位于另一个包中的“已更改”Bar 的自己的副本。

enter image description here

关于java - maven-shade-plugin 的用途是什么,为什么要重新定位 Java 包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13620281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com