{"id":140,"date":"2026-10-12T12:31:49","date_gmt":"2026-10-12T12:31:49","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2009\/06\/20\/ant-script-to-reset-buildnumber\/"},"modified":"2026-10-12T12:31:49","modified_gmt":"2026-10-12T12:31:49","slug":"ant-script-to-reset-buildnumber","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/ant-script-to-reset-buildnumber\/","title":{"rendered":"Apache Ant Script to Reset and Increment Build Numbers (CI-Friendly Modes)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Originally published on 2009-06-20; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide shows how to manage a resettable, multi-part build number in Apache Ant. It is useful for teams maintaining Ant-based CI\/release pipelines and needing predictable version increments for major, minor, hotfix, revision, and optional continuous builds.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Source context: <a href=\"https:\/\/www.devopsschool.com\/blog\/ant-script-to-reset-buildnumber\/\">original DevOpsSchool post<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2009\/06\/ant-script-to-reset-buildnu.png\" alt=\"Ant script to reset build number\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">How this build numbering pattern works<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The script keeps version state in a <code>build.number<\/code> file and updates it based on <code>-Dincrement=...<\/code>. By default, the build number is four parts (<code>major.minor.hotfix.revision<\/code>). For continuous builds, it can include a fifth part (<code>continuous<\/code>).<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>increment value<\/th><th>What changes<\/th><th>Output format<\/th><th>Example command<\/th><\/tr><\/thead><tbody><tr><td>(not set)<\/td><td>Revision increments by 1<\/td><td>major.minor.hotfix.revision<\/td><td>ant<\/td><\/tr><tr><td>major<\/td><td>major +1, minor=1, hotfix=0, revision=1<\/td><td>major.minor.hotfix.revision<\/td><td>ant -Dincrement=major<\/td><\/tr><tr><td>minor<\/td><td>minor +1, hotfix=0, revision=1<\/td><td>major.minor.hotfix.revision<\/td><td>ant -Dincrement=minor<\/td><\/tr><tr><td>hotfix<\/td><td>hotfix +1, revision=1<\/td><td>major.minor.hotfix.revision<\/td><td>ant -Dincrement=hotfix<\/td><\/tr><tr><td>continuous<\/td><td>continuous +1<\/td><td>major.minor.hotfix.revision.continuous<\/td><td>ant -Dincrement=continuous<\/td><\/tr><tr><td>contReset<\/td><td>continuous=1<\/td><td>major.minor.hotfix.revision.continuous<\/td><td>ant -Dincrement=contReset<\/td><\/tr><tr><td>rebuild<\/td><td>No counter change in the provided switch case<\/td><td>major.minor.hotfix.revision<\/td><td>ant -Dincrement=rebuild<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Create the build.number state file<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Initialize the property file once in your project root:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-properties\">major.number=1\nminor.number=0\nhotfix.number=0\nrevision.number=0\ncontinuous.number=0<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Add task definitions and targets in build.xml<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original snippet relies on Ant-Contrib tasks (such as <code>var<\/code>, <code>switch<\/code>, <code>math<\/code>, <code>if<\/code>) plus an <code>unset<\/code> task from Antelope.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Task definitions<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">taskdef<\/span> <span class=\"hljs-attr\">resource<\/span>=<span class=\"hljs-string\">\"net\/sf\/antcontrib\/antlib.xml\"<\/span>\/&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">taskdef<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"unset\"<\/span> <span class=\"hljs-attr\">classname<\/span>=<span class=\"hljs-string\">\"ise.antelope.tasks.Unset\"<\/span>\/&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Target 1: initialize counters from build.number<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">target<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"initBuildNum\"<\/span> <span class=\"hljs-attr\">description<\/span>=<span class=\"hljs-string\">\"Get current build number properties\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property<\/span> <span class=\"hljs-attr\">file<\/span>=<span class=\"hljs-string\">\"build.number\"<\/span>\/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">var<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"next.major\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"${major.number}\"<\/span>\/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">var<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"next.minor\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"${minor.number}\"<\/span>\/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">var<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"next.hotfix\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"${hotfix.number}\"<\/span>\/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">var<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"next.revision\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"${revision.number}\"<\/span>\/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">var<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"next.continuous\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"${continuous.number}\"<\/span>\/&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">target<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Target 2: apply increment logic<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">target<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"getBuildNum\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">switch<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"${increment}\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">case<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"rebuild\"<\/span>\/&gt;<\/span>\n\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">case<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"major\"<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">math<\/span> <span class=\"hljs-attr\">result<\/span>=<span class=\"hljs-string\">\"next.major\"<\/span> <span class=\"hljs-attr\">operand1<\/span>=<span class=\"hljs-string\">\"${next.major}\"<\/span> <span class=\"hljs-attr\">operation<\/span>=<span class=\"hljs-string\">\"+\"<\/span> <span class=\"hljs-attr\">operand2<\/span>=<span class=\"hljs-string\">\"1\"<\/span> <span class=\"hljs-attr\">datatype<\/span>=<span class=\"hljs-string\">\"int\"<\/span>\/&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">var<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"next.minor\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"1\"<\/span>\/&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">var<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"next.hotfix\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"0\"<\/span>\/&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">var<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"next.revision\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"1\"<\/span>\/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">case<\/span>&gt;<\/span>\n\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">case<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"minor\"<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">math<\/span> <span class=\"hljs-attr\">result<\/span>=<span class=\"hljs-string\">\"next.minor\"<\/span> <span class=\"hljs-attr\">operand1<\/span>=<span class=\"hljs-string\">\"${next.minor}\"<\/span> <span class=\"hljs-attr\">operation<\/span>=<span class=\"hljs-string\">\"+\"<\/span> <span class=\"hljs-attr\">operand2<\/span>=<span class=\"hljs-string\">\"1\"<\/span> <span class=\"hljs-attr\">datatype<\/span>=<span class=\"hljs-string\">\"int\"<\/span>\/&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">var<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"next.hotfix\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"0\"<\/span>\/&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">var<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"next.revision\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"1\"<\/span>\/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">case<\/span>&gt;<\/span>\n\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">case<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"hotfix\"<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">math<\/span> <span class=\"hljs-attr\">result<\/span>=<span class=\"hljs-string\">\"next.hotfix\"<\/span> <span class=\"hljs-attr\">operand1<\/span>=<span class=\"hljs-string\">\"${next.hotfix}\"<\/span> <span class=\"hljs-attr\">operation<\/span>=<span class=\"hljs-string\">\"+\"<\/span> <span class=\"hljs-attr\">operand2<\/span>=<span class=\"hljs-string\">\"1\"<\/span> <span class=\"hljs-attr\">datatype<\/span>=<span class=\"hljs-string\">\"int\"<\/span>\/&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">var<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"next.revision\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"1\"<\/span>\/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">case<\/span>&gt;<\/span>\n\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">case<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"continuous\"<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">math<\/span> <span class=\"hljs-attr\">result<\/span>=<span class=\"hljs-string\">\"next.continuous\"<\/span> <span class=\"hljs-attr\">operand1<\/span>=<span class=\"hljs-string\">\"${next.continuous}\"<\/span> <span class=\"hljs-attr\">operation<\/span>=<span class=\"hljs-string\">\"+\"<\/span> <span class=\"hljs-attr\">operand2<\/span>=<span class=\"hljs-string\">\"1\"<\/span> <span class=\"hljs-attr\">datatype<\/span>=<span class=\"hljs-string\">\"int\"<\/span>\/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">case<\/span>&gt;<\/span>\n\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">case<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"contReset\"<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">var<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"next.continuous\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"1\"<\/span>\/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">case<\/span>&gt;<\/span>\n\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">default<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">math<\/span> <span class=\"hljs-attr\">result<\/span>=<span class=\"hljs-string\">\"next.revision\"<\/span> <span class=\"hljs-attr\">operand1<\/span>=<span class=\"hljs-string\">\"${next.revision}\"<\/span> <span class=\"hljs-attr\">operation<\/span>=<span class=\"hljs-string\">\"+\"<\/span> <span class=\"hljs-attr\">operand2<\/span>=<span class=\"hljs-string\">\"1\"<\/span> <span class=\"hljs-attr\">datatype<\/span>=<span class=\"hljs-string\">\"int\"<\/span>\/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">default<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">switch<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">target<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Target 3: persist and expose full.buildnumber<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">target<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"setBuildNumber\"<\/span> <span class=\"hljs-attr\">depends<\/span>=<span class=\"hljs-string\">\"initBuildNum,getBuildNum\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">propertyfile<\/span> <span class=\"hljs-attr\">file<\/span>=<span class=\"hljs-string\">\"build.number\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">entry<\/span> <span class=\"hljs-attr\">key<\/span>=<span class=\"hljs-string\">\"major.number\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"${next.major}\"<\/span>\/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">entry<\/span> <span class=\"hljs-attr\">key<\/span>=<span class=\"hljs-string\">\"minor.number\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"${next.minor}\"<\/span>\/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">entry<\/span> <span class=\"hljs-attr\">key<\/span>=<span class=\"hljs-string\">\"hotfix.number\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"${next.hotfix}\"<\/span>\/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">entry<\/span> <span class=\"hljs-attr\">key<\/span>=<span class=\"hljs-string\">\"revision.number\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"${next.revision}\"<\/span>\/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">entry<\/span> <span class=\"hljs-attr\">key<\/span>=<span class=\"hljs-string\">\"continuous.number\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"${next.continuous}\"<\/span>\/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">propertyfile<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">unset<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"major.number\"<\/span>\/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">unset<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"minor.number\"<\/span>\/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">unset<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"hotfix.number\"<\/span>\/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">unset<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"revision.number\"<\/span>\/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">unset<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"continuous.number\"<\/span>\/&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property<\/span> <span class=\"hljs-attr\">file<\/span>=<span class=\"hljs-string\">\"build.number\"<\/span>\/&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">if<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">or<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">equals<\/span> <span class=\"hljs-attr\">arg1<\/span>=<span class=\"hljs-string\">\"${increment}\"<\/span> <span class=\"hljs-attr\">arg2<\/span>=<span class=\"hljs-string\">\"continuous\"<\/span>\/&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">equals<\/span> <span class=\"hljs-attr\">arg1<\/span>=<span class=\"hljs-string\">\"${increment}\"<\/span> <span class=\"hljs-attr\">arg2<\/span>=<span class=\"hljs-string\">\"contReset\"<\/span>\/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">or<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">then<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"full.buildnumber\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"${major.number}.${minor.number}.${hotfix.number}.${revision.number}.${continuous.number}\"<\/span>\/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">then<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">else<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"full.buildnumber\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"${major.number}.${minor.number}.${hotfix.number}.${revision.number}\"<\/span>\/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">else<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">if<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">echo<\/span>&gt;<\/span>${full.buildnumber}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">echo<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">target<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Make your main build target depend on <code>setBuildNumber<\/code> so the version is calculated before packaging.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">target<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"build\"<\/span> <span class=\"hljs-attr\">depends<\/span>=<span class=\"hljs-string\">\"setBuildNumber,compile,test,package\"<\/span>\/&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Command examples<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">ant\nant -Dincrement=major\nant -Dincrement=minor\nant -Dincrement=hotfix\nant -Dincrement=continuous\nant -Dincrement=contReset<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Build number update workflow<\/h2>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Run ant with optional increment] --> B[Load build.number]\n    B --> C[Evaluate increment mode]\n    C --> D[Update counters in memory]\n    D --> E[Write counters to build.number]\n    E --> F[Reload properties]\n    F --> G[Set full.buildnumber]\n    G --> H[Echo version for downstream targets]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Common pitfalls and best practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Keep <code>build.number<\/code> under controlled write access; concurrent CI jobs can overwrite each other.<\/li><li>Ensure required task libraries are on Ant&#8217;s classpath before running this script.<\/li><li>Document when to use <code>major<\/code>, <code>minor<\/code>, and <code>hotfix<\/code> to avoid accidental version jumps.<\/li><li>Be explicit in CI: pass <code>-Dincrement=...<\/code> rather than relying on defaults.<\/li><li>If you need immutable build metadata, publish <code>${full.buildnumber}<\/code> as an artifact variable after each run.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Learn how to implement a persistent build numbering scheme in Ant using a build.number file and three targets. This revised guide explains major, minor, hotfix, revision, and continuous increment modes with runnable examples.<\/p>\n","protected":false},"author":1,"featured_media":4095,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[12],"tags":[209,3326,3045,3322,3321,3320,3328,1122,3113,938,3319,3323,3325,3327,278,213,3324],"class_list":["post-140","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-apache-ant","tag-ant","tag-ant-reset-build-number","tag-ant-script","tag-ant-script-to-reset-buildnumber","tag-build-number","tag-buildnumber","tag-change-buildnumber","tag-guide","tag-how-to","tag-reference","tag-reset","tag-reset-buildnumber","tag-reset-buildnumber-by-ant-script","tag-resetting-build-numbers","tag-script","tag-tutorial","tag-use-ant-script-to-reset-buildnumber"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/140","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=140"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/140\/revisions"}],"predecessor-version":[{"id":78989,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/140\/revisions\/78989"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4095"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=140"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=140"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=140"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}