6

我正在使用现有的独立 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。但我不能做的是将现有的项目文件推送到一个新的子目录中。

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

谢谢

后续:基于模块可以简单地是本地目录中的文件的输入,我创建了另一个调用原始文件的 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
4

3 回答 3

13

要回答这篇文章标题中的问题:

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

  • 子关系是通过parent在子 POM 中定义的。如果您的父母在回购中,就是这样。如果你的父母在文件系统上,你必须玩parent.relativePath它才能在同一个文件夹中找到它
  • 模块是通过modules在父 POM 中定义的。模块通常包含一个文件夹名称,并且隐含 POM 文件(例如<module>mod</module>等同于<module>mod/pom.xml</module>)。因此,同一文件夹中的模块将是<module>pom1.xml</module>什么。(我在这个例子中调用了模块的 POM 文件pom1.xml,假设它pom.xml已经被父级占用了——看看我们把自己弄得多么混乱)

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


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


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


事实上,Maven 确实允许您在同一个文件夹中拥有父级和子级,这一点根本不是这样做的好理由。Maven 的某些部分或其中一个插件对您不利只是时间问题。Maven 是“约定优于配置”,以此为生!

于 2013-04-24T05:43:30.657 回答
2

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

于 2013-08-22T03:20:31.120 回答
1

请参考 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 启动项目作为我的父级引用。终于在我的所有子模块中使用了我的父引用。所以这种方式我将它用作两种模型的组合。

于 2018-04-30T21:37:55.123 回答