【问题标题】:Can maven parent project include a module at same directory levelmaven父项目可以在同一目录级别包含模块吗
【发布时间】:2013-04-17 07:51:51
【问题描述】:

我正在使用现有独立 pom.xml 的已建立代码库中工作。

我们的目的是将一个名为“hive”的子项目合并到父项目的子目录中。注意:hive/pom.xml 确实已经存在并且它自己可以正常工作。

所以在父级的 pom.xml 中我添加了:

   <modules>
      <module>hive</module>
   </modules>

问题是我基本上失去了从父项目创建可部署 jar 的能力。

 stephenb@gondolin:/shared/git2/etl$ mvn package assembly:single
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[ERROR] FATAL ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Error building POM (may not be this project's POM).


Project ID: com.myco.etl:etl
POM Location: /shared/git2/etl/pom.xml
Validation Messages:

    [0]  Packaging 'jar' is invalid. Aggregator projects require 'pom' as packaging.


Reason: Failed to validate POM for project com.myco.etl:etl at /shared/git2/etl/pom.xml


[INFO] ------------------------------------------------------------------------
[INFO] Trace
org.apache.maven.reactor.MavenExecutionException: Failed to validate POM for project com.myco.etl:etl at /shared/git2/etl/pom.xml
    at org.apache.maven.DefaultMaven.getProjects(DefaultMaven.java:404)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:272)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:362)
    at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

maven 似乎希望我创建一个父 pom,它除了定义依赖模块之外基本上什么都不做。

我可以创建一个新的 pom.xml。但是我不能做的就是将现有的项目文件推送到一个新的子目录中。

有没有办法解决这个问题?例如。定义一个位于同一级别的子模块(不是子目录)?或者其他方式来处理现有的 dir 结构?

谢谢

跟进:基于模块可以简单地成为本地目录中的文件的输入,我 创建了另一个调用原始 pom 的 pom。原来的重命名为 pommod.xml,下图的新的名为 pom.xml。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.myco.etl</groupId>
    <artifactId>etl</artifactId>
    <name> ETL Helpers</name>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>
        <modules>
  <module>appminer</module>
  <module>pommod.xml</module>
   </modules>

我跑了“mvn compile package”,但还是报同样的错误:

Project ID: com.myco:app_miner
POM Location: /shared/git2/etl/mycopom.xml
Validation Messages:

[0]  Packaging 'jar' is invalid. Aggregator projects require 'pom' as packaging.


Reason: Failed to validate POM for project com.myco:app_miner at /shared/git2/etl/myco/pom.xml

【问题讨论】:

    标签: maven module


    【解决方案1】:

    回答本文标题中的问题:

    是的,Maven 可以在同一目录级别包含父级和模块。我觉得我首先必须解释父母可以有孩子和模块。子和模块不是一回事:

    • 子关系通过子 POM 中的parent 定义。如果您的父母在回购中,就是这样。如果您的父母在文件系统上,您必须使用parent.relativePath 才能在同一文件夹中找到它
    • 模块是通过父 POM 中的modules 定义的。模块通常包含文件夹名称,并隐含 POM 文件(例如,&lt;module&gt;mod&lt;/module&gt; 等同于 &lt;module&gt;mod/pom.xml&lt;/module&gt;)。因此,同一文件夹中的模块将是 &lt;module&gt;pom1.xml&lt;/module&gt; 或其他东西。 (在此示例中,我将模块的 POM 文件称为 pom1.xml,假设 pom.xml 已被父级占用 - 看看我们把自己弄得多么混乱)

    让我快速举一个示例,其中子模块和模块明显不同:您可能有 POM 来构建每个团队的应用程序。您的每个团队都可能拥有 web 应用程序和后端应用程序。您可能有 webapps 和后端应用程序的父 POM。因此,某些后端应用程序将是后端应用程序的 POM 的子级,同时是正在开发它的团队的一个模块。


    让我印象深刻的是你在谈论包装。父 POM(包装 pom)通常只是一个元数据块,没有别的。如果您希望它是其他东西,您仍然可以将插件执行附加到生命周期阶段。您甚至可以运行打包插件并将结果附加到工件。


    我不明白为什么hive 不能是子级(自己的文件夹,该文件夹中的自己的 POM),很好地比父级低一级,Maven 的本意。但在我看来,您可以在任何其他目录中拥有一些项目,依赖于hive 中的jar 工件,并将其转换为您想要的任何程序集。所以hive 将是装配项目的依赖项(比如说hive-assembly)。这就是我的下一点......


    事实上,Maven 确实允许您在同一个文件夹中拥有父级和子级,这一事实根本不是这样做的好理由。 Maven 的某些部分或其中一个插件对您不利只是时间问题。 Maven 是“convention over configuration”,靠它生活!

    【讨论】:

    • 我使用了你关于让模块只是一个 pomXX.xml 文件的提示。仍然有问题并更新了原始帖子。
    • 也许只分享所涉及项目的更多 POM 细节。你正在建造哪一个,它是如何失败的?
    • 似乎有必要有两个不同的pom;一个用于 pom 目标作为父级,另一个用于 jar 文件。然后它就可以工作了——尽管很不方便。
    • 如果您将父级声明为pom,您会缺少什么?什么不起作用?我在想通过插件的生命周期绑定你应该能够实现你想要的。 (executions.execution.phase 等)
    【解决方案2】:

    这个问题可以通过使用maven的Project Aggregation而不是Project Inheritance来解决。

    【讨论】:

      【解决方案3】:

      请参考maven网站给出的简单示例: http://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Project_Inheritance_vs_Project_Aggregation

      这清楚地解释了您何时想要拥有父子关系或包模块关系或父模块关系(两者的组合)。

      Spring Boot 项目示例:

      我将所有 sprint boot 项目与 spring boot starter 项目一起使用 父母,所以我在这里有亲子关系。

      对于打包,我在根目录中有单独的 pom 文件(或 相对路径),它定义了其中的所有模块。但是没有 在我的模块中引用我的父项目。所以在这里我用它作为 包-模块关系。

      但最近更改了我的配置以使用父模块关系,创建了父 pom 文件并引用 spring boot starter 项目作为我的父母在其中。终于用了我的父母 我所有子模块中的引用。所以这种方式我用它作为 两种模型的组合。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-03
        • 1970-01-01
        • 2019-01-10
        • 1970-01-01
        • 1970-01-01
        • 2018-07-11
        相关资源
        最近更新 更多