如何删除依赖关系:Maven子模块在父模块上创建隐式依赖关系

emp*_*e29 1 java module maven

我有一个Maven项目

  • 父项目(带有以下模块)(包类型为pom)
    • API项目(程序包类型jar)
    • 包装项目(依赖于API项目)(包装类型自定义)

我希望能够将API项目部署到Nexus存储库,以便其他人可以利用该代码。包装项目更多地是一个支持实用程序项目,适用于较小的部署用例集。父项目将所有内容都包装在一起。

当我将API项目部署到联系仓库时,它可以很好地部署。如果我尝试创建一个依赖于API的全新项目,它会在关联中找到API依赖关系,但同时也希望有Parent项目。有没有办法解决发布父项目的问题,因为通过联系回购使用父库时,使用API​​库确实不是必需的?

关于如何组织Maven项目以支持此的任何提示?

Ste*_*lly 5

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

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

好消息是,继承不必遵循聚合。这到底是什么意思?

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

继承是在设置项目的时<parent>

Maven <parent><modules>任何地方都没有强制项目<modules>必须将其子项列出为,Maven 在任何地方都没有强制项目必须将项目列出为<parent>

有些人会像这样建立他们的项目

ROOT/
 +- pom.xml
 +- parent/
 |   \- pom.xml
 +- api/
 |   \- pom.xml
 \- packaging/
     \- pom.xml
Run Code Online (Sandbox Code Playgroud)

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

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

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