1

我有一个 Maven 项目

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

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

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

关于如何组织我的 Maven 项目以支持这一点的任何提示?

4

2 回答 2

5

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

因此,为了让 Maven 构建您的项目的模型,Maven 必须自己检索父级。换句话说,添加<parent>标签会在父子节点之间创建一个明确的硬依赖关系。

好消息是Inheritance 不必遵循 Aggregation。这到底是什么意思?

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

继承是当您设置项目的<parent>.

Maven 没有强制要求项目<parent>必须将其子项列为<modules>,而且 Maven 也没有强制要求项目<modules>必须将项目列为<parent>.

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

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

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

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

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

于 2012-10-22T09:04:01.673 回答
0

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

于 2015-06-08T12:18:57.663 回答