我发现有人在pom.xml中使用了maven-shade-plugin。我以前从未使用过maven-shade-plugin(我是一名Maven n00b),所以我试图理解使用它的原因和它的作用。
我查看了Maven文档,但我无法理解以下说法:
“这个插件提供了将工件打包到uber-jar中的功能,包括它的依赖项,并对一些依赖项的包进行遮蔽(即重命名)。”
页面上的文档看起来对新手不太友好。
什么是“优步罐子”?为什么会有人想做一个?重命名依赖项的包有什么意义?我尝试过maven-shade-plugin apache页面上的示例,例如“为Uber Jar选择内容”,但我仍然无法理解“着色”是如何实现的。
任何指向说明性示例/用例的指针(说明为什么在这种情况下需要着色-它解决了什么问题)都将非常感谢。最后,什么时候应该使用maven-shade-plugin?
优步罐子,简而言之,就是一个装了一切的罐子。
通常在Maven中,我们依赖于依赖管理。工件只包含其自身的类/资源。Maven将负责在构建项目时找出项目所依赖的所有工件(JAR等)。
uber-jar是一个接收所有依赖项的东西,提取依赖项的内容,并将它们与项目本身的类/资源一起放在一个大jar中。通过拥有这样一个uber-jar,执行起来很容易,因为你将只需要一个大JAR,而不是成吨的小JAR来运行你的应用程序。在某些情况下,这也使分发工作更加容易。
请注意:避免使用uber-jar作为Maven的依赖项,因为它会破坏Maven的依赖项解析特性。通常,我们只为实际部署或手动分发的最终工件创建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
需要使用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
的自己的副本。
问题内容: 我发现有人的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. 无连接 请记住,这