当前位置: 首页 > 面试题库 >

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

鲜于岳
2023-03-14
问题内容

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

我看了看Maven文档,但是我听不懂这句话:

“此插件提供了将工件打包在uber-jar中的功能,包括其依赖项,并可以遮蔽(即重命名)某些依赖项的包。”

该页面上的文档似乎不太适合新手。

什么是“超级jar”?为什么有人要做一个?重命名依赖包的意义何在?我尝试浏览了Maven-shade-plugin apache页面上的示例,例如“为Uber Jar选择内容”,但是我仍然不明白使用“ shading”可以完成什么。

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


问题答案:

简而言之,Uber JAR是包含所有内容的JAR。

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

uber-jar是一个包含所有依赖项的东西,并提取依赖项的内容并将其与项目本身的类/资源放在一个大的JAR中。通过拥有这样的uber-jar,它很容易执行,因为你只需要一个大JAR即可运行大量应用,而无需大量的小JAR。在某些情况下,这也简化了分配。

只是一个旁注。避免将uber-jar用作Maven依赖项,因为它破坏了Maven的依赖项解析功能。通常,我们仅为最终工件创建uber-jar以便进行实际部署或手动分发,而不是将其放入Maven存储库。

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

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

例如,我正在开发Foo库,这取决于库的特定版本(例如1.0)Bar。假设我无法使用其他版本的Barlib(因为API更改或其他技术问题等)。如果我只是在Maven中声明Bar:1.0Foo的依赖项,则可能会遇到一个问题:一个Qux项目依赖于Foo,并且也依赖Bar:2.0(并且它不能使用,Bar:1.0因为Qux需要使用中的新功能Bar:2.0)。这是一个难题:应该Qux使用Bar:1.0(哪个Qux代码不起作用)还是Bar:2.0(哪个Foo代码不起作用)?

为了解决此问题,of的开发人员Foo可以选择使用shade插件重命名其用法Bar,以便将Bar:1.0jar中的所有类都嵌入Foojar中,并将嵌入Bar类的包从更改com.barcom.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 Surefire插件的用途是什么?我找不到合适的例子。

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

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