Java 着色JAR的传递依赖
我已经使用maven shade插件打包了myjar,我很想知道它在被客户机maven项目引用时的行为 maven着色jar在maven环境中引用时是否下载可传递依赖项 我是否能够排除shade插件打包的依赖项,并假设当客户端引用myjar和构建时,它们将由maven下载 所需场景: 1.从命令行执行myjar以显示一个AWT表单对话框(它将写出一个许可证文件) 2.客户项目在标准maven中引用。Maven应该以传递方式下载所有依赖项Java 着色JAR的传递依赖,java,maven,maven-shade-plugin,Java,Maven,Maven Shade Plugin,我已经使用maven shade插件打包了myjar,我很想知道它在被客户机maven项目引用时的行为 maven着色jar在maven环境中引用时是否下载可传递依赖项 我是否能够排除shade插件打包的依赖项,并假设当客户端引用myjar和构建时,它们将由maven下载 所需场景: 1.从命令行执行myjar以显示一个AWT表单对话框(它将写出一个许可证文件) 2.客户项目在标准maven中引用。Maven应该以传递方式下载所有依赖项 因此,为了满足场景1的要求,我希望包括forms-1.2.
因此,为了满足场景1的要求,我希望包括forms-1.2.1的依赖项,但不包括场景2期间客户端下载的所有其他依赖项。Maven仅对pom文件的内容进行处理,包括直接依赖项和传递依赖项。只要项目的pom声明了正确的依赖项,客户机构建就会按预期工作。使用shade插件创建jar的事实与此无关。在maven环境中引用时,所有依赖项都是使用pom文件下载的。但是,如果您已经创建了一个包含所有内置依赖项的着色jar(uber jar),那么它也可以在非maven(比如在项目中直接引用为jar)环境中使用,因为所有依赖项都已经存在。您的问题似乎与着色插件无关
关于为什么在JAR中有选择地打包依赖项会破坏依赖项管理的更新: 例如,您正在开发依赖于
bar-2.0
的foo-1.0
。现在,您决定在foo-1.0.jar
中包含bar-2.0
类
如果有人依赖您的foo-1.0
,并且他想使用bar-2.1
,他将陷入麻烦:他的应用程序类路径将包含来自bar-2.0
(它是foo-1.0
的一部分)和bar-2.1
(项目本身声明的)的类,而且你很难预测代码使用的是哪个bar
因此,shade插件的一个用例是对依赖项进行着色,这涉及到包重命名(即我在原始答案中提到的着色),而不是简单地将依赖项直接包含在JAR中。我不明白为什么它会“破坏Maven的依赖项管理”,你能详细解释一下吗?谢谢@AdrianShum,我确实需要forms-1.2.1在jar中,以便从命令行执行,并且不介意是否获得所有form-1.2.1可传递依赖项。我正在寻找一个关于场景2是否会在客户端构建时下载所有其他依赖项的明确答案。这就是我所说的,你应该确保这是一个只用于执行的uber jar,而不是其他依赖的。那么我如何打包以服务于这两个场景呢?它必须可能有一个正常的jar工件,用于正常的依赖关系。Uber jar可以使用单独的分类器创建,这样就不会与主要工件混淆。