Java 具有属性的Maven版本
我有大约400个插件的大型Maven(Tycho)项目 我们在每个POM文件中指定了应用程序的版本 有没有办法只在一个地方为所有POM:s指定版本 我希望有人会这样想:Java 具有属性的Maven版本,java,maven,version,Java,Maven,Version,我有大约400个插件的大型Maven(Tycho)项目 我们在每个POM文件中指定了应用程序的版本 有没有办法只在一个地方为所有POM:s指定版本 我希望有人会这样想: <properties> <buildVersion>1.1.2-SNAPSHOT</buildVersion> </properties> .... <version>${buildVersion}</version> 然后在每个POM中引用父POM
<properties>
<buildVersion>1.1.2-SNAPSHOT</buildVersion>
</properties>
....
<version>${buildVersion}</version>
然后在每个POM中引用父POM:
<parent>
<artifactId>build.parent</artifactId>
<groupId>company</groupId>
<relativePath>../build.parent/pom.xml</relativePath>
<version>1.1.2-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>artifact</artifactId>
<version>1.1.2-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
build.parent
公司
../build.parent/pom.xml
1.1.2-快照
4.0.0
公司
人工制品
1.1.2-快照
eclipse插件
如果您有一个父项目,您可以在父pom中设置版本,在子项目中,您可以使用${project.version}或${version}属性引用同级库
如果要避免在每个子项中重复父项的版本:可以执行以下操作:
<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>build.parent</artifactId>
<version>${my.version}</version>
<packaging>pom</packaging>
<properties>
<my.version>1.1.2-SNAPSHOT</my.version>
</properties>
4.0.0
公司
build.parent
${my.version}
聚甲醛
1.1.2-快照
然后在你的孩子pom中,你必须做到:
<parent>
<artifactId>build.parent</artifactId>
<groupId>company</groupId>
<relativePath>../build.parent/pom.xml</relativePath>
<version>${my.version}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>artifact</artifactId>
<packaging>eclipse-plugin</packaging>
<dependencies>
<dependency>
<groupId>company</groupId>
<artifactId>otherartifact</artifactId>
<version>${my.version}</version>
or
<version>${project.version}</version>
</dependency>
</dependencies>
build.parent
公司
../build.parent/pom.xml
${my.version}
4.0.0
公司
人工制品
eclipse插件
公司
其他人工制品
${my.version}
或
${project.version}
hth对版本使用属性会生成以下警告:
[WARNING]
[WARNING] Some problems were encountered while building the effective model for xxx.yyy.sandbox:Sandbox:war:0.1.0-SNAPSHOT
[WARNING] 'version' contains an expression but should be a constant. @ xxx.yyy.sandbox:Sandbox:${my.version}, C:\Users\xxx\development\gwtsandbox\pom.xml, line 8, column 14
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
如果您的问题是因为切换版本而必须在多个位置更改版本,那么正确的做法是使用Maven Release插件,该插件将自动为您执行此操作。如果您使用Maven 3,解决此问题的一个选项是使用versions插件 特别是命令
mvn versions:set -DnewVersion=2.0-RELEASE
mvn versions:commit
这将把父级和子级POM更新为2.0版本。您可以在之前将此作为生成步骤运行
与发行版插件不同,它不会尝试与源代码管理对话正确答案如下(示例版本):
- 在parent pom.xml中,您应该在
${project.version} 实际上,您还可以省略父级之外的项目属性,这些属性是相同的,因为它们将被继承。结果如下所示:属性中有(not):
您的400个模块都将更新父版本。对于Maven版本3.5或更高版本,您应该能够在父部分中使用占位符(例如${revision}),在pom的其余部分中,您可以使用<project> <parent> <artifactId>build.parent</artifactId> <groupId>company</groupId> <relativePath>../build.parent/pom.xml</relativePath> <version>${revision}</version> <!-- use placeholder --> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>artifact</artifactId> <!-- no 'version', no 'groupId'; inherited from parent --> <packaging>eclipse-plugin</packaging> ... </project>
参见Maven-用户论坛: 这就是为什么这是一个糟糕的计划 部署的pom不会解析属性值,因此 任何依赖于该pom的人都会将依赖项看作是与${}无关的字符串,并且在您的应用程序中会出现很多欢闹 构建过程 在maven 2.1.0和/或2.2.0中,尝试使用 已解析属性。。。这超出了预期,这就是为什么 不推荐使用两个版本,2.2.1是推荐的2.x版本
我有两个建议给你- 用于所有工件。您可以在
文件中添加.mvn/maven.config
。所以基本上你只在一个地方定义你的版本-Drevision=2.0.1
- 对于所有外部依赖项,在父文件中创建属性。你可以作为参考
pom.xml的版本应有效<groupId>com.amazonaws.lambda</groupId> <artifactId>lambda</artifactId> <version>2.2.4 SNAPSHOT</version> <packaging>jar</packaging>
com.amazonaws.lambda 兰姆达 2.2.4快照 罐子
此版本不应与2.2.4类似。etc目前我有一个父pom,但我需要在其中包含版本,因此这意味着每个pom都指定了父pom的verison。如果我尝试删除两个版本元素,并仅在父pom中保留版本,我会遇到以下异常:[错误]生成无法读取1个项目->[帮助1]org.apache.maven.project.ProjectBuildingException:处理POM时遇到一些问题:[致命]“parent.version”丢失。@第6行第13列[警告]为公司构建有效模型时遇到一些问题:group1:pom:1.1.2-SNAPSHOT[警告]“version”包含表达式,但应为常量。@company:maven test:${my.version},[WARNING][WARNING]强烈建议修复这些问题,因为它们威胁到构建的稳定性。[警告][警告]出于这个原因,未来的Maven版本可能不再支持生成这种格式错误的项目。在新版本的Maven中,此功能将不再有效!maven 3.5.4对我来说很有效,注意3.5.2和3.6.0都不起作用。你能解释一下maven发布插件是如何解决这个问题的吗?实际上,它并没有解决报告的问题,因为这不是正确的方法,所以你不应该在属性中设置项目的版本。如果您的项目有多个模块,那么正确的做法是让发布插件为您更改所有pom.xml文件中的版本。在我们的例子中,我们使用update POM命令将所有模块的版本设置为parent,如下所示:
这涉及到修改POM,这意味着源代码控制的文件现在被修改,我发现这是不合适的。目标是更改版本。这里的讨论是是否可以在一个地方完成。这会产生警告并要求使用常量版本,但仍然取决于this@DavutGürbüz这里没有(在Maven 3.6.0中,如果您按照链接页面上的说明操作),这修改了pom.xml文件,这意味着后续生成是从修改过的源代码生成的,我认为这是不可取的。@BobBell不修改pom文件就无法更新版本。@ACV这不是真的。您可以使用的替代版本进行构建,使用mvn release:update versions-DautoVersionSubmodules=true
并在命令行上传递${revision}
。@BobBell,我正在传递命令行-Drevision
<parent> <groupId>com.vvirlan</groupId> <artifactId>grafiti</artifactId> <version>0.0.1-SNAPSHOT</version> </parent>
mvn versions:set -DnewVersion=0.0.2-SNAPSHOT mvn versions:commit # Necessary to remove the backup file pom.xml
<project> <parent> <artifactId>build.parent</artifactId> <groupId>company</groupId> <relativePath>../build.parent/pom.xml</relativePath> <version>${revision}</version> <!-- use placeholder --> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>artifact</artifactId> <!-- no 'version', no 'groupId'; inherited from parent --> <packaging>eclipse-plugin</packaging> ... </project>
<groupId>com.amazonaws.lambda</groupId> <artifactId>lambda</artifactId> <version>2.2.4 SNAPSHOT</version> <packaging>jar</packaging>
- 用于所有工件。您可以在