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

时间:2012-10-21 15:02:39

标签: java maven module

我有一个maven项目

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

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

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

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

2 个答案:

答案 0 :(得分:3)

当您向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>。您可能需要复制其他位,但在删除mvn help:effective-pom标记之前和之后应使用Maven命令<parent>以帮助查看有效差异

答案 1 :(得分:0)

我的开发I use uber-pom maven plugin which merges information in maven project hierarchy并提供独立的pom作为结果,我在maven中心发布工件而没有任何额外的父母链接