当前位置: 首页 > 知识库问答 >
问题:

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

梁丘安晏
2023-03-14

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

我查看了Maven文档,但我无法理解以下说法:

“这个插件提供了将工件打包到uber-jar中的功能,包括它的依赖项,并对一些依赖项的包进行遮蔽(即重命名)。”

页面上的文档看起来对新手不太友好。

什么是“优步罐子”?为什么会有人想做一个?重命名依赖项的包有什么意义?我尝试过maven-shade-plugin apache页面上的示例,例如“为Uber Jar选择内容”,但我仍然无法理解“着色”是如何实现的。

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

共有1个答案

蒲昊
2023-03-14

优步罐子,简而言之,就是一个装了一切的罐子。

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

uber-jar是一个接收所有依赖项的东西,提取依赖项的内容,并将它们与项目本身的类/资源一起放在一个大jar中。通过拥有这样一个uber-jar,执行起来很容易,因为你将只需要一个大JAR,而不是成吨的小JAR来运行你的应用程序。在某些情况下,这也使分发工作更加容易。

请注意:避免使用uber-jar作为Maven的依赖项,因为它会破坏Maven的依赖项解析特性。通常,我们只为实际部署或手动分发的最终工件创建uber-jar,而不是将其放入Maven存储库。

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

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

例如,我正在开发foo库,它依赖于bar库的特定版本(例如1.0)。假设我不能使用barlib的其他版本(因为API更改或其他技术问题等)。如果我在Maven中简单地将bar:1.0声明为foo的依赖项,那么可能会遇到一个问题:qux项目依赖于foo,同时也依赖于bar:2.0(并且它不能使用bar:1.0,因为qux需要使用bar:2.0中的新特性)。这里有一个两难的问题:qux应该使用bar:1.0(哪个qux的代码不起作用)还是bar:2.0(哪个foo的代码不起作用)?

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

 类似资料:
  • 问题内容: 我发现有人的pom.xml中使用了maven-shade-plugin。我以前从未使用过maven-shade-plugin(并且我是Maven n00b),所以我试图了解使用它的原因及其作用。 我看了看Maven文档,但是我听不懂这句话: “此插件提供了将工件打包在uber-jar中的功能,包括其依赖项,并可以遮蔽(即重命名)某些依赖项的包。” 该页面上的文档似乎不太适合新手。 什么

  • 我在运行包含比Hadoop发行版(CDH 5.2)中包含的版本更新的Guava的Hadoop作业时遇到了一些麻烦。这是一个已知的问题。我试图通过使用Maven shade插件对库进行着色来解决这个问题。因此,我在我的中添加了以下几行:

  • 我阅读了一些关于的的源代码: 是否自动使用dependency-reduced-pom.xml而不是pom.xml? shade插件生成的dependency-reduced-pom.xml的目的是什么? 将dependency-reduced-pom.xml添加到基目录的Maven shade插件 https://maven.apache.org/plugins/maven-shade-plug

  • 问题内容: 我对Maven快照的含义以及为什么要构建一个快照感到困惑。 问题答案: Maven中的快照版本尚未发布。 这个想法是,前一个版本(或任何其他版本)完成后,存在一个。那个版本可能会变成 。它基本上是“ 开发中”。这可能接近实际发行版,或相当遥远(0.9例如,发行后立即发行)。 “真实”版本和快照版本之间的区别在于快照可能会得到更新。这意味着今天下载的文件可能不同于昨天或明天下载的文件。

  • Bootstrapping(引导) 是 Netty 中配置程序的过程,当你需要连接客户端或服务器绑定指定端口时需要使用 Bootstrapping。 如前面所述,Bootstrapping 有两种类型,一种是用于客户端的Bootstrap,一种是用于服务端的ServerBootstrap。不管程序使用哪种协议,无论是创建一个客户端还是服务器都需要使用“引导”。 面向连接 vs. 无连接 请记住,这