繁体   English   中英

如何删除依赖:maven子模块创建对父模块的隐式依赖

[英]How to remove dependency: maven sub-modules creates implicit dependency on parent module

我有一个maven项目

  • 父项目(包含以下模块)(包类型pom)
    • API项目(包类型jar)
    • 打包项目(依赖于API项目)(包类型自定义)

我希望能够将API项目部署到Nexus存储库,以便其他人可以利用该代码。 对于较小的部署用例集,Packaging Project更像是一个支持实用程序项目。 Parent Project为我整理了所有内容。

当我将API项目部署到nexus repo时,它部署得很好。 如果我尝试创建一个对API有依赖性的全新项目,它会在nexus中找到API依赖项,但是也需要父项目。 有什么方法可以绕过发布父项目,因为在通过nexus repo使用API​​ lib时,它真的不是必需的吗?

有关如何组织我的maven proj以支持此功能的任何提示?

当您向Maven项目添加<parent>引用时,您正在做的是:“从该父项中获取所有配置并将其注入到我的模型中,然后使用以下内容覆盖”

因此,为了让Maven构建项目模型,Maven必须检索父项本身。 换句话说,添加<parent>标记会在父级和子级之间创建显式的硬依赖关系。

好消息是继承不必遵循聚合 这究竟意味着什么?

聚合是指在pom中列出<modules>的时候。 它告诉Maven反应堆(即Maven构建的项目集)还应包括以下(子)项目。

继承是指设置项目的<parent>

Maven强制执行项目的<parent>必须将其子项列为<modules> ,并且Maven强制执行项目<modules>必须将项目列为<parent>

有些人会这样设置他们的项目

ROOT/
 +- pom.xml
 +- parent/
 |   \- pom.xml
 +- api/
 |   \- pom.xml
 \- packaging/
     \- pom.xml

ROOTapipackaging的父母实际上是ROOT的孩子。 或者有时ROOT将是一个没有父母的独立项目[事实上这是我自己经常使用的模式。 当我正在处理几个相关的项目时,我将在我的本地磁盘上汇总一个聚合的pom.xml并用我的IDE打开它,这样所有相关的代码都可以作为一个单独的“项目”使用,即使实际的模块可能会来来自不同的来源]

因此,在您的情况下,解决方案是从“API”模块中删除<parent>标记。

现在! 有一个缺点。 从“API”模块中删除<parent>标记后,您已删除了父项目提供的所有默认值,因此您需要复制与“API”项目相关的默认值,否则您可能会发现微妙的行为的变化。 例如,您应该肯定地复制插件版本的固定,以及与“API”依赖关系相关的任何<dependencyManagement> 您可能需要复制其他位,但是您应该在删除<parent>标记之前和之后使用Maven命令mvn help:effective-pom以帮助查看有效差异

对于我的开发我使用uber-pom maven插件合并maven项目层次结构中的信息并提供独立的pom作为结果我在maven中心发布工件而没有任何额外的链接到父母

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM