gpt4 book ai didi

maven - maven父项目可以包含同一目录级别的模块吗

转载 作者:行者123 更新时间:2023-12-04 05:40:24 25 4
gpt4 key购买 nike

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

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

所以在 parent 的 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 的 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 可以在同一目录级别包含父级和模块。我觉得我首先必须解释 parent 可以有 child 和模块。 child 和模块不是一回事:

  • 子关系通过 parent 定义在子 POM 中。如果您的 parent 在 repo 中,就是这样。如果你的 parent 在文件系统上,你必须玩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)通常只是元数据的 blob,没有别的。如果您希望它是其他东西,您仍然可以将插件执行附加到生命周期阶段。您甚至可以运行打包插件并将结果附加到 Artifact 。

    我不明白为什么 hive不能是一个 child (自己的文件夹,在那个文件夹中拥有自己的 POM),很好地比父级低一级,Maven 的本意。但在我看来,你可以有一些项目,在任何其他目录中,都依赖于 jar hive 中的神器,然后把它变成你想要的任何程序集。所以 hive将是组装项目的依赖项(假设 hive-assembly )。这就是我的下一个重点......

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

    关于maven - maven父项目可以包含同一目录级别的模块吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16180530/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com