maven父项目是否可以在同一目录级别包含一个模块

jav*_*dba 6 module maven

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

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

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

   <modules>
      <module>hive</module>
   </modules>
Run Code Online (Sandbox Code Playgroud)

问题是我基本上失去了从父项目创建可部署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)
Run Code Online (Sandbox Code Playgroud)

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

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

有办法解决这个问题吗?例如,定义一个生活在同一级别(不是subdir)的子模块?或者使用现有dir结构的其他方式?

谢谢

后续:基于模块可以简单地作为本地目录中的文件的输入,我创建了另一个调用原始模块的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>
Run Code Online (Sandbox Code Playgroud)

我运行"mvn编译包"但仍然得到相同的错误:

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
Run Code Online (Sandbox Code Playgroud)

San*_*gen 11

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

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

  • 儿童关系parent在儿童POM中定义.如果你的父母在回购中,就是这样.如果您的父级在文件系统上,则必须使用parent.relativePath它才能在同一文件夹中找到它
  • 模块modules在父POM中定义.模块通常包含文件夹名称,并隐含POM文件(例如<module>mod</module>,等同于<module>mod/pom.xml</module>).因此,同一文件夹中的模块将是<module>pom1.xml</module>或类似的.(我pom1.xml在这个例子中调用了模块的POM文件,假设pom.xml已经由父母采取了 - 看看我们自己陷入了什么样的混乱)

让我快速给出一个示例,其中子项和模块明显不同:您可以使用POM来构建每个团队的应用程序.您的每个团队都可能拥有网络应用和后端应用.您可能拥有用于webapps和后端应用程序的父POM.因此,一些后端应用程序将成为后端应用程序的POM的子项,同时成为正在处理它的团队的一个模块.


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


我不明白为什么hive不能成为一个孩子(自己的文件夹,在该文件夹中拥有自己的POM),很好地从父母那里下来一层,Maven是怎么想的.但是对我而言,就像你可以在某个项目中,在任何其他目录中,依赖于jar工件hive,并将其转换为您想要的任何程序集.那hive将是装配项目的依赖(让我们说hive-assembly).那是我的下一点......


实际上,Maven确实让你在同一个文件夹中拥有父母和孩子这一事实并不是一个很好的理由.Maven的某些部分或其中一个插件对你起作用只是时间问题.Maven是" 惯例而不是配置 ",活着!