Java 如何在构建时在maven中设置项目版本?

Java 如何在构建时在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

我试图在我们的项目中实现语义版本控制。我测试了maven semver插件,但这对我没有帮助,所以请不要问我为什么。我最终使用了maven groovy。不过,它的工作原理很有魅力,当我安装或部署maven项目时,存储库中的版本就是变量名

尽管所有的人工制品和jar文件都是用正确的版本打包的,但这是事实

请看我的pom.xml

<?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中考虑