【问题标题】:Maven unpack-dependencies of a plugin dependency插件依赖项的 Maven 解包依赖项
【发布时间】:2016-05-18 15:37:47
【问题描述】:

如何为 <plugin> 部分中指定的依赖项运行 dependency:unpack-dependencies

我有三个包含可执行文件和其他东西的包,我们称它们为parentchildconsumerchild 依赖于parent。为了构建消费者,我需要获取child 及其所有依赖项(即parent),解压缩它们的内容并做一些事情。

我现在的作品,有点:

child 的依赖在<project> 中被声明为“全局”时,解包将按预期进行。但是,这意味着生成的consumer 包依赖于child,这是我不想要的。依赖项必须仅用于创建,而不是使用。

当我将依赖项移动到 <plugins><plugin> 部分时,它会被 dependency:unpack-dependencies 忽略(dependency:unpack 处理并解压它,但这不是传递的)

我错过了什么?谢谢


Maven 知道传递依赖 child -> parent。当我删除整个本地存储库并仅运行此 POM 时,会下载 parent


以下情况的非常粗略的图表。创建最终工件需要绿色工件(之后不需要使用它),因此对它们的依赖仅属于该部分。最终神器的使用需要蓝色神器,因此对它有依赖。

【问题讨论】:

  • 你想达到什么目的?为什么要解压插件依赖项?
  • 不是java项目。在父包中有一个 protobuffer 编译器,在子包中有一个用于所述编译器的插件。使用这个 pom 我希望 Maven 下载指定版本的插件,然后下载它所依赖的编译器。使用 exec 插件,然后我使用一些参数运行编译器,然后将创建的工件打包到一个 jar 中。我们使用多种语言针对多个平台,Maven 在我看来是一个很好的工具。(其中一些是 java,其中没有任何问题的情况。对于非 java 来说,仍然可以使用一些警告 - 就像这个)
  • 您能否更具体地说明protobuffer compiler 的含义?
  • 简而言之,它是 Google 开发的用于序列化和反序列化数据的工具。那不重要。底线是我的 .jars 包含我需要解压缩然后运行的可执行文件(在 bash、cmd 等中,基于平台)。但是,我无法解压缩传递依赖项。
  • 稍微想一想...为什么不打包可执行文件并单独部署它们并将它们作为依赖项添加到插件中,这意味着它们将在运行时在插件的类路径上...它们会自动下载...

标签: maven


【解决方案1】:

当您为整个项目指定依赖项时,由于您的解包工作正常,也许您应该保持这种方式。当其他项目依赖于您的项目时,您可以简单地指示 Maven 不要将其包含在插件依赖项中,而不是将其移动到插件依赖项中。有两种方法可以做到:

  1. 指定<scope>provided</scope> - 这将告诉 Maven 编译需要依赖项,但预计会在运行时通过其他方式(例如提供它的应用程序服务器或捆绑它)在运行时可用。
  2. 指定<optional>true</optional> - 这将防止依赖项被其他项目传递解决,具体取决于您的项目。相反,如果需要,他们必须明确指定。

【讨论】:

  • 第一个建议确实有效,但感觉有点骇人听闻。如果没有更好的结果,我会使用它。
  • @MartinMelka 老实说,我认为这是正确的方法。这是因为依赖关系是一个更广泛的概念,而不仅仅是“应该下载其他库并将其添加到类路径”。您的项目显然与其他项目做了一些事情,因此它们是某种类型的项目依赖项,而不是运行时依赖项。
猜你喜欢
  • 2018-02-27
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多