Java 如何在构建时在maven中设置项目版本?
我试图在我们的项目中实现语义版本控制。我测试了maven semver插件,但这对我没有帮助,所以请不要问我为什么。我最终使用了maven groovy。不过,它的工作原理很有魅力,当我安装或部署maven项目时,存储库中的版本就是变量名 尽管所有的人工制品和jar文件都是用正确的版本打包的,但这是事实 请看我的pom.xmlJava 如何在构建时在maven中设置项目版本?,java,groovy,maven-3,Java,Groovy,Maven 3,我试图在我们的项目中实现语义版本控制。我测试了maven semver插件,但这对我没有帮助,所以请不要问我为什么。我最终使用了maven groovy。不过,它的工作原理很有魅力,当我安装或部署maven项目时,存储库中的版本就是变量名 尽管所有的人工制品和jar文件都是用正确的版本打包的,但这是事实 请看我的pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.o
<?xml version="1.0" encoding="UTF-8"?>
<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.mytest.test</groupId>
<artifactId>test-tag</artifactId>
<version>${revision}</version>
<description>Test</description>
<properties>
<ChangeType>TO_BE_SET</ChangeType>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.gmaven</groupId>
<artifactId>gmaven-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<providerSelection>2.0</providerSelection>
<properties>
<script>git describe --abbrev=0 --tags</script>
</properties>
<source>
def tagIt = 'git tag -a vXXXX -m "Auto tagged"'
def changeType = project.properties.ChangeType
def command = project.properties.script
def process = command.execute()
process.waitFor()
def describe = process.in.text.trim()
println "Setting revision to: " + describe
if(!describe.startsWith("v")) {
describe = "1.0.1"
} else {
describe = describe.substring(1)
}
project.properties.setProperty('revision', describe)
</source>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<id>default-compile</id>
<phase>none</phase>
</execution>
<execution>
<id>default-testCompile</id>
<phase>none</phase>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>default-testResources</id>
<phase>none</phase>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<id>default-jar</id>
<phase>package</phase>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<executions>
<execution>
<id>default-test</id>
<phase>none</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
4.0.0
com.mytest.test
测试标签
${revision}
试验
准备
org.codehaus.gmaven
gmaven插件
1.5
验证
执行
2
git descripe--abbrev=0--tags
def tagIt='git tag-a vxxx-m“自动标记”'
def changeType=project.properties.changeType
def命令=project.properties.script
def process=command.execute()
process.waitFor()
def descripe=process.in.text.trim()
println“将修订设置为:”+描述
如果(!description.startsWith(“v”)){
description=“1.0.1”
}否则{
描述=描述子字符串(1)
}
project.properties.setProperty(“修订版”,描述)
maven编译器插件
默认编译
没有一个
默认测试编译
没有一个
maven资源插件
默认测试资源
没有一个
maven jar插件
默认jar
包裹
maven surefire插件
默认测试
没有一个
版本是${revision}一个在groovy脚本中设置的变量名。groovy代码所做的是从GIT获取最后一个标记,然后将其设置为属性“revision”
最终的jar文件提取了正确的版本,但当安装到存储库中时,文件夹名称和jar名称如下:
m2\repository\com\mytest\test\test tag\${revision}\test tag-${revision}.jar
我尝试使用以下命令将“修订”默认为值:
<properties>
<revision>1.0.1</revision>
</properties>
1.0.1
但是groovy代码设置该值没有效果
我还尝试了maven groovy插件的不同阶段,没有运气。我错过什么了吗?有人能帮我吗
我想提到的是,正如vatbub和StefanHeimberg所提到的,我可以使用versions:set来设置版本,但这需要我对GIT进行额外的提交,我正试图避免这种情况,我想知道是否可以通过编写maven插件来实现这一点 使用Maven,您可以在构建时使用
mvn versions:set -DnewVersion=${bamboo.inject.version}
正如@vatbub已经在您的问题中评论的那样
除此之外,我还编写了一个Shell脚本,可以在构建管道中使用该脚本根据maven项目版本生成版本,并从构建服务器添加构建编号
该脚本读取maven项目版本,添加一个版本号,并编写一个包含所有可使用的新版本号的文本文件
下一步是将此文本文件注入构建管道中,并如上所述调用versions插件
pom.xml:
差不多
<project>
<groupId>ch.stefanheimberg.example</groupId>
<artifactId>your-awesome-app</artifactId>
<version>5.1.2-SNAPSHOT</version>
</project>
第二步:
./generate_version_txt.sh ${bamboo.buildNumber}
在构建系统中注入生成的version.txt,所有属性可用于所有任务/插件等
在我的例子中,Bambol CI准备好version.txt文件,并在bambol.inject.
前缀下将文件内容声明为环境变量
例如${bambol.inject.long_version}
第三步:
./generate_version_txt.sh ${bamboo.buildNumber}
更新Maven项目版本
mvn versions:set -DnewVersion=${bamboo.inject.version}
第4步:
./generate_version_txt.sh ${bamboo.buildNumber}
运行Maven构建
mvn clean verify
第五步:
./generate_version_txt.sh ${bamboo.buildNumber}
运行Docker构建
例如,也将其用作docker标记版本。等等
docker build --build-arg version=${bamboo.inject.version} --tag your-awesome-app:${bamboo.inject.version} .
Dockerfile示例:
FROM jboss/wildlfy
ARG version
ADD target/your-awesome-app-${version}.war /opt/jboss/wildfly/standalone/deployments/
我知道对于groovy脚本来说,这可能是一个问题/不可能。但也许这是对你的问题的另一种看法。可能还有另一个解决方案
(对不起我的英语。但我希望我的意思可以理解)我遇到了一个类似的问题,最后使用确保在部署前从POMs中删除所有变量。这将删除对字符串${revision}的所有引用,并在生成时替换为实际值,而不会干扰原始POM。您是否尝试过版本maven插件?它有一个
set
目标,可以修改项目版本。()但是,afaik、maven解析pom,并且在构建期间对pom所做的更改仅在后续bu中考虑