{"id":144,"date":"2026-10-12T13:01:11","date_gmt":"2026-10-12T13:01:11","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2009\/10\/06\/what-are-antform-antmenu\/"},"modified":"2026-10-12T13:01:11","modified_gmt":"2026-10-12T13:01:11","slug":"what-are-antform-antmenu","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/what-are-antform-antmenu\/","title":{"rendered":"AntForm and AntMenu for Apache Ant: Installation, Usage, and Practical XML Examples"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">AntForm and AntMenu are Java-based extensions for Apache Ant that add interactive GUI screens to command-driven build workflows. If you maintain legacy Ant build files, this guide will help you understand the two tasks, define them correctly, and run working examples with minimal trial and error.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally published on 2009-10-06; fully revised and updated.<\/em><\/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\/10\/antform-antmenu.png\" alt=\"AntForm and AntMenu screenshot\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">What AntForm and AntMenu do<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/ant.apache.org\/\">Apache Ant<\/a> is widely used in Java build and automation pipelines. AntForm and AntMenu extend Ant with GUI-driven interaction for cases where runtime user input is required.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>AntForm<\/strong>: Shows a Swing form so users can enter or select values that are written into Ant properties.<\/li><li><strong>AntMenu<\/strong>: Shows a button-style menu that launches selected Ant targets.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">In short, AntForm focuses on <strong>collecting properties<\/strong>, while AntMenu focuses on <strong>navigating and launching targets<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">AntForm vs AntMenu at a glance<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Task<\/th><th>Primary purpose<\/th><th>User interaction<\/th><th>Typical output<\/th><th>Best use case<\/th><\/tr><\/thead><tbody><tr><td>antform<\/td><td>Capture property values<\/td><td>Form fields (text, selection, boolean, multiline)<\/td><td>Ant properties set at runtime, optionally saved to a properties file<\/td><td>Build or deploy flows where user input drives later targets<\/td><\/tr><tr><td>antmenu<\/td><td>Launch targets from a menu<\/td><td>Buttons and links mapped to targets<\/td><td>Execution of selected Ant targets<\/td><td>Operator-facing entry points for multi-target build scripts<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Typical execution flow in an Ant build<\/h2>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Run ant target] --> B[Load task definitions]\n    B --> C{Which task runs}\n    C -- antform --> D[Show Swing form]\n    D --> E[User submits values]\n    E --> F[Set Ant properties]\n    C -- antmenu --> G[Show button menu]\n    G --> H[User chooses target]\n    H --> I[Run selected target]\n    F --> I\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This flow is useful when a script cannot be fully non-interactive and needs guided, structured user input.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Installation and task definition<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">After downloading the package, extract it to a directory such as <code>antform.home<\/code>. Then define tasks in your Ant build file so Ant can load classes from <code>antform.jar<\/code>.<\/p>\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\">name<\/span>=<span class=\"hljs-string\">\"antform\"<\/span> <span class=\"hljs-attr\">classname<\/span>=<span class=\"hljs-string\">\"com.sardak.antform.AntForm\"<\/span>\n         <span class=\"hljs-attr\">classpath<\/span>=<span class=\"hljs-string\">\"${antform.home}\/lib\/antform.jar\"<\/span>\/&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">taskdef<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"antmenu\"<\/span> <span class=\"hljs-attr\">classname<\/span>=<span class=\"hljs-string\">\"com.sardak.antform.AntMenu\"<\/span>\n         <span class=\"hljs-attr\">classpath<\/span>=<span class=\"hljs-string\">\"${antform.home}\/lib\/antform.jar\"<\/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<p class=\"wp-block-paragraph\">You can also load the provided task definitions resource instead of defining each task explicitly:<\/p>\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\">taskdef<\/span> <span class=\"hljs-attr\">resource<\/span>=<span class=\"hljs-string\">\"com\/sardak\/antform\/taskdefs.properties\"<\/span>\n         <span class=\"hljs-attr\">classpath<\/span>=<span class=\"hljs-string\">\"${antform.home}\/lib\/antform.jar\"<\/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<p class=\"wp-block-paragraph\">If <code>antform.jar<\/code> is copied into <code>${ant_home}\/lib<\/code>, explicit classpath references may not be required for each task definition.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Running the provided sample targets<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original package includes a sample build file named <code>test.xml<\/code>. With Ant and PATH configured, run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css language-bash\"><span class=\"hljs-selector-tag\">ant<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">test<\/span><span class=\"hljs-selector-class\">.xml<\/span> <span class=\"hljs-selector-tag\">test<\/span> <span class=\"hljs-selector-tag\">testmenu<\/span> <span class=\"hljs-selector-tag\">testne<\/span> <span class=\"hljs-selector-tag\">spinners<\/span> <span class=\"hljs-selector-tag\">password<\/span> <span class=\"hljs-selector-tag\">wizard1<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">To list available sample targets:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css language-bash\"><span class=\"hljs-selector-tag\">ant<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">test<\/span><span class=\"hljs-selector-class\">.xml<\/span> <span class=\"hljs-selector-tag\">-p<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Example: AntForm task for mail-style input<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This sample form collects recipient, subject, message body, and a send flag, then stores values as Ant properties.<\/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\">antform<\/span> <span class=\"hljs-attr\">title<\/span>=<span class=\"hljs-string\">\"Send Mail\"<\/span>\n         <span class=\"hljs-attr\">save<\/span>=<span class=\"hljs-string\">\"properties.txt\"<\/span>\n         <span class=\"hljs-attr\">image<\/span>=<span class=\"hljs-string\">\"doc\/images\/testlogo.jpg\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">label<\/span>&gt;<\/span>To send a mail, use the following form. Pick a recipient, type a subject and a body...the script will do the rest.<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">label<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">selectionProperty<\/span> <span class=\"hljs-attr\">label<\/span>=<span class=\"hljs-string\">\"Recipient: \"<\/span>\n                       <span class=\"hljs-attr\">property<\/span>=<span class=\"hljs-string\">\"recipient\"<\/span>\n                       <span class=\"hljs-attr\">values<\/span>=<span class=\"hljs-string\">\"address1@somewhere.com; address2@somewhere.com; address4@somewhere.com\"<\/span>\n                       <span class=\"hljs-attr\">separator<\/span>=<span class=\"hljs-string\">\";\"<\/span>\/&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">textProperty<\/span> <span class=\"hljs-attr\">label<\/span>=<span class=\"hljs-string\">\"Subject : \"<\/span> <span class=\"hljs-attr\">property<\/span>=<span class=\"hljs-string\">\"subject\"<\/span>\/&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">multilineTextProperty<\/span> <span class=\"hljs-attr\">label<\/span>=<span class=\"hljs-string\">\"Message body: \"<\/span>\n                           <span class=\"hljs-attr\">property<\/span>=<span class=\"hljs-string\">\"body\"<\/span>\/&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">booleanProperty<\/span> <span class=\"hljs-attr\">label<\/span>=<span class=\"hljs-string\">\"Send immediately: \"<\/span> <span class=\"hljs-attr\">property<\/span>=<span class=\"hljs-string\">\"send\"<\/span>\/&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">antform<\/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\">Example: AntMenu task for target navigation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This sample defines a vertical menu that launches specific test targets.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" 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\">antmenu<\/span> <span class=\"hljs-attr\">image<\/span>=<span class=\"hljs-string\">\"doc\/images\/logo-small.jpg\"<\/span>\n         <span class=\"hljs-attr\">title<\/span>=<span class=\"hljs-string\">\"AntForm and AntMenu tests\"<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">AntMenuItem<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"AntMenu Tests\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">AntMenuItem<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"Mail-type form\"<\/span> <span class=\"hljs-attr\">target<\/span>=<span class=\"hljs-string\">\"test\"<\/span>\/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">AntMenuItem<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"Spinners and dateProperty test\"<\/span> <span class=\"hljs-attr\">target<\/span>=<span class=\"hljs-string\">\"spinners\"<\/span>\/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">AntMenuItem<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"Test non-editable properties\"<\/span> <span class=\"hljs-attr\">target<\/span>=<span class=\"hljs-string\">\"testne\"<\/span>\/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">AntMenuItem<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"Login and password test\"<\/span> <span class=\"hljs-attr\">target<\/span>=<span class=\"hljs-string\">\"password\"<\/span>\/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">AntMenuItem<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"AntForm with inner menu test\"<\/span> <span class=\"hljs-attr\">target<\/span>=<span class=\"hljs-string\">\"afm\"<\/span>\/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">AntMenuItem<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"Wizards test\"<\/span> <span class=\"hljs-attr\">target<\/span>=<span class=\"hljs-string\">\"wizard1\"<\/span>\/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">AntMenuItem<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">AntMenuItem<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"AntMenu tests\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">AntMenuItem<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"This test\"<\/span> <span class=\"hljs-attr\">target<\/span>=<span class=\"hljs-string\">\"testmenu\"<\/span>\/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">AntMenuItem<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">label<\/span>&gt;<\/span>A short label with a few explanatory words concerning the menu at hand.<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">label<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">link<\/span> <span class=\"hljs-attr\">label<\/span>=<span class=\"hljs-string\">\"Echo 1 target\"<\/span> <span class=\"hljs-attr\">target<\/span>=<span class=\"hljs-string\">\"echo1\"<\/span>\/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">link<\/span> <span class=\"hljs-attr\">label<\/span>=<span class=\"hljs-string\">\"Echo 2 target\"<\/span> <span class=\"hljs-attr\">target<\/span>=<span class=\"hljs-string\">\"echo2\"<\/span>\/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">link<\/span> <span class=\"hljs-attr\">label<\/span>=<span class=\"hljs-string\">\"Echo 3 target\"<\/span> <span class=\"hljs-attr\">target<\/span>=<span class=\"hljs-string\">\"echo3\"<\/span>\/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">link<\/span> <span class=\"hljs-attr\">label<\/span>=<span class=\"hljs-string\">\"End\"<\/span> <span class=\"hljs-attr\">target<\/span>=<span class=\"hljs-string\">\"end\"<\/span>\/&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">antmenu<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><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\">Best practices for legacy Ant GUI tasks<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Keep AntForm and AntMenu usage limited to workflows that genuinely need operator input.<\/li><li>Store reusable defaults in properties files, then override only what users must change.<\/li><li>Use clear labels and predictable target names to reduce operator mistakes.<\/li><li>Test in an environment with desktop UI support, since AntForm uses Swing components.<\/li><li>Document a non-GUI fallback target when possible for automation and CI jobs.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">More information: <a href=\"http:\/\/antforms.sourceforge.net\/\">http:\/\/antforms.sourceforge.net\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>AntForm and AntMenu are legacy Apache Ant extensions that add GUI forms and button menus to build scripts. This guide explains what each task does, how to install them, and how to run practical examples.<\/p>\n","protected":false},"author":1,"featured_media":4086,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[8],"tags":[3284,3296,3299,3294,3298,3297,3290,3292,3285,3291,3293,3295,670,3286,3287,3288,3289],"class_list":["post-144","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-training","tag-antform","tag-antform-antmenu-guide","tag-antform-antmenu-installation","tag-antform-antmenu-introduction","tag-antform-antmenu-reference","tag-antform-antmenu-tutorial","tag-antform-example","tag-antform-usage","tag-antmenu","tag-antmenu-example","tag-antmenu-usage","tag-overview-antform-antmenu","tag-what","tag-what-is-antform","tag-what-is-antmenu","tag-why-antform","tag-why-antmenu"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/144","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=144"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/144\/revisions"}],"predecessor-version":[{"id":78992,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/144\/revisions\/78992"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4086"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=144"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=144"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=144"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}