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



我有一个maven项目

  • 父级项目(带有以下模块)(软件包类型POM)
    • API项目(包装类型JAR)
    • 包装项目(对API项目有一个依赖性)(软件包类型自定义)

我希望能够将API项目部署到Nexus存储库,以便其他人可以利用该代码。包装项目更多是用于较小的部署用例集合的支持实用项目。父母项目为我全部包裹。

当我将API项目部署到Nexus Repo时,它会很好地部署。如果我尝试制作一个对API具有脱颖而出的全新项目,它会发现Nexus的API依赖性,但也希望同时使用父级项目。是否有任何方法可以通过Nexus Repo使用?

关于如何组织我的小型Proj支持这一点的任何提示?

当您将<parent>引用到Maven项目时,您在做什么是在说:/p>

因此,为了使Maven构建项目的模型,Maven有必要检索父母本身。换句话说,添加<parent>标签会在父母和孩子之间产生明确的硬依赖性。

好消息是,继承不必遵循汇总。那是什么意思?

聚合是当您在POM中列出<modules>时。它告诉Maven,反应堆(即Maven构建的项目集)也应包括以下(SUB)项目。

继承是设置项目的<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 Project层次结构中的信息,并提供独立的POM,我在Maven Central中发布文物,而没有任何额外的链接

最新更新