Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
发布托管在单个Git存储库中的多模块Maven项目_Git_Maven_Maven Release Plugin_Multi Module - Fatal编程技术网

发布托管在单个Git存储库中的多模块Maven项目

发布托管在单个Git存储库中的多模块Maven项目,git,maven,maven-release-plugin,multi-module,Git,Maven,Maven Release Plugin,Multi Module,我试图发布多模块项目的各个模块,这些模块包含在一个git存储库中 文件夹结构如下所示: |- api/pom.xml |- database/pom.xml |- core/pom.xml pom.xml 父pom只是作为一种构建所有子组件的方式,通过使用标记,这种方式是有意义的。本质上,构建api,然后是数据库,然后是核心 该项目一开始托管在SVN中,只需在mavenscm标记中指向存储库中的不同路径,就很容易让maven release命令发挥作用。Git的情况似乎并非如此

我试图发布多模块项目的各个模块,这些模块包含在一个git存储库中

文件夹结构如下所示:

  |- api/pom.xml
  |- database/pom.xml
  |- core/pom.xml
  pom.xml
父pom只是作为一种构建所有子组件的方式,通过使用
标记,这种方式是有意义的。本质上,构建api,然后是数据库,然后是核心

该项目一开始托管在SVN中,只需在maven
scm
标记中指向存储库中的不同路径,就很容易让
maven release
命令发挥作用。Git的情况似乎并非如此

当运行
mvn release:prepare
时,它会根据需要对api pom执行更改,但当执行
mvn release:perform
时,它会尝试构建父pom,并且由于无法解析database/pom.xml中列出的api快照依赖关系而无法构建数据库包

我应该如何配置我的scm标记,以便能够在Git存储库中发布特定模块?这可能吗

编辑:添加pom示例 以下是pom文件外观的示例设置:

父pom.xml


4.0.0
com.findwise.hydra
水螅亲本
0.2.0
聚甲醛
应用程序编程接口
数据库
核心
api/pom.xml


4.0.0
com.findwise.hydra
海德拉api
罐子
0.2.0
${project.artifactId}
海德拉API
...
...
UTF-8
...
${project.name}
...
数据库
pom看起来非常像
api
,但它依赖于
api
。这同样适用于
核心
,它依赖于
数据库
(并通过它,依赖于
api


尽管
api
database
工件本身很重要,因为
api
定义了客户端api和
database
后端api,两者都用于与应用程序集成。由此产生了单独发布它们的最初想法——父pom只是一种事后思考,以允许更简单地构建整个堆栈

发布多模块构建的常用方法是从根位置执行,这意味着也可以使用它发布所有子模块。不单独释放单个模块。如果您尝试这样做,您将失去版本之间的关系

如果您真的想单独发布模块,只需从中创建单独的maven项目,并为每个项目提供一个git存储库

您提到的树看起来非常像一个多模块构建,它应该在根目录的一个步骤中发布

根据您所更新的内容,我建议您使用以下结构的真正多模块构建:

root
 +-- pom.xml (1.0-SNAPSHOT)
 !
 +-- api 
 !     +-- pom.xml (1.0-SNAPSHOT)
 +-- database
 !     +-- pom.xml (1.0-SNAPSHOT)
 +-- core
       +-- pom.xml (1.0-SNAPSHOT)
最好是在Maven中使用继承,这意味着在每个模块api、核心、数据库中都使用这样的父级:

  |- api/pom.xml
  |- database/pom.xml
  |- core/pom.xml
  pom.xml

4.0.0
com.findwise.hydra
您正在使用到父级中,如:


org.apache.maven.plugins
进入父级,这使您有机会仅在一个点上使用相应的版本定义依赖项,而无需在模块中定义版本

这将大大减少模块中pom的大小


结果将是通过单个
mvn发行版:prepare
等从父级发布,但将产生不同的工件,如
hydra api
hydra core
hydra数据库
,具有相同的版本号,确保有api,核心等。是否在api、数据库或核心模块中使用父标记引用父pom中的内容?我没有在模块pom.xml中使用父标记。根目录中的“父”pom或多或少只允许以正确的顺序构建核心和所有其他组件。我是否需要在“子模块”POM中使用父标记?父级的一步发布会释放所有模块工件,还是仅仅是某种超级工件?如果您使用它以正确的顺序构建,您会有从核心到api等的依赖关系。在这种情况下,我建议从我描述的单个点进行真正的多模块构建和发布。你能发布你的父母pom,也许还有一个模块吗?使讨论更简单。添加了有关POM的更多信息。感谢您提供的任何建议!:)非常好的建议。非常感谢。这一次我最终手动发布了pom,但将按照您的建议重新排列pom,看起来这是正确且最好的方法。