【问题标题】:Make Maven child poms have same version number as parent? [duplicate]使 Maven 子 pom 具有与父级相同的版本号? [复制]
【发布时间】:2014-08-16 10:46:58
【问题描述】:

我有一个多模块(聚合器)Maven 项目,它也从父 pom 继承属性。所以在我的父母 pom.xml 我有这个:

<groupId>com.something.project</groupId>
<artifactId>MyProject</artifactId>
<packaging>pom</packaging>
<version>1.0.123</version>

<modules>
    <module>ModuleA</module>
    <module>ModuleB</module>
    <module>ModuleC</module>
</modules>

我想让所有子模块继承父版本号1.0.123,但是子pom.xml 要求我继续硬编码父版本号(ModuleA pom.xml 示例):

<artifactId>ModuleA</artifactId>
<name>Some Amazing Thing</name>

<parent>
    <relativePath>../</relativePath>
    <artifactId>MyProject</artifactId>
    <version>1.0.123</version>
    <groupId>com.something.project</groupId>
</parent>

我怎样才能将版本号放在父 pom 中,并让模块继承它而不必在多个地方更新它?到目前为止,我已经尝试过 ${project.version} 和 ${project.parent.version} 并且 Maven 似乎对此很不满意。我也不能完全删除版本参考。

有人对此有好的答案吗?

【问题讨论】:

  • aven 似乎对此很不满意请解释一下
  • 这是典型的先有鸡还是先有蛋的场景。您希望从父版本继承版本号,但没有指定要从哪个版本的父版本继承版本号!
  • 我得到的具体错误是这样的(注意路径已被编辑): [错误] 不可解析的父 POM:无法传输工件 com.something.project:MyProject:pom:${ project.version} from/to internal(repo 路径):索引 91 处路径中的非法字符:myserver/blah/blah/blah/${project.version}/MyProject-${project.version}.pom 和 'parent.relativePath' 指向错误的本地POM @ 第 11 行,第 13 列 -> [帮助 2]
  • @MarkPeters - 明白了,但是在我使用父 pom 构建整个项目的情况下,它不应该首先运行并提供该信息吗?我可以理解,如果我直接去子 pom 并说“现在运行,没有父信息”,但在这种情况下,Maven 应该从父 pom 内部访问子 pom,不是吗?我觉得很奇怪。
  • 我不认为 maven 构建是这样工作的(这就是为什么孩子必须首先引用父 pom)。每个模块构建都有些独立。

标签: java maven


【解决方案1】:

一般来说,如果你使用maven来管理版本,把父版本放在子模块pom中是没有问题的。当您运行 maven 发布插件时,它会为您更新所有子模块中的所有版本。

更新:

如果您想自己管理版本,那么您可能会感到有些痛苦。我很确定您必须在每个 pom 中至少指定一次版本号。您可能可以通过编写一些为您执行递归搜索和替换的脚本来为自己简化事情(而不是手动执行)。

作为一个侧面背景:maven 是用“最好的(maven)做事方式”的心态构建的。如果您按照这种方式进行操作,那么事情通常会变得非常简单并且非常运行良好。以不同的方式做事通常是可能的,但是您离“最佳方式”越远,事情就会越痛苦(或不可能)。

【讨论】:

  • 很遗憾,我们没有使用 maven 发布插件,我们手动进行所有版本管理。我不知道为什么。 :(
  • 我必须同意你关于“最好的(maven)做事方式”的评论——看起来只要你按照 maven 的方式去做,你就可以,但如果你走开从此,就有了麻烦。感谢您的帮助。
  • 使用mvn versions:set 在整个层次结构中设置版本。 Maven 一直需要一个父版本才能正确解析 pom,但我认为它已经改变了..??
  • re: maven's way of doing things 不幸的是,maven 的一些文档特别推荐了实际上不起作用的东西。也许他们曾经工作过,但事情从这种风格演变而来。例如,文档说如果父级使用&lt;modules&gt;...&lt;/modules&gt; 样式,那么子模块甚至根本不需要指定父级。不再是真的了。
【解决方案2】:

我想这已经被回答了@ Can you inherit the version from the parent POM in Maven?

我尝试了该解决方案,它对我有用(使用 Apache Maven 3.0.5)。但是,它有一个限制,如果我们直接进入子 pom 并构建,它不会解析版本变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 2012-02-19
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多