{"id":229,"date":"2026-10-12T23:41:05","date_gmt":"2026-10-12T23:41:05","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2010\/04\/14\/usage-of-ant_opts-in-ant-script-ant_opts-capabilities\/"},"modified":"2026-10-12T23:41:05","modified_gmt":"2026-10-12T23:41:05","slug":"usage-of-ant_opts-in-ant-script-ant_opts-capabilities","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/usage-of-ant_opts-in-ant-script-ant_opts-capabilities\/","title":{"rendered":"ANT_OPTS in Apache Ant: JVM Memory, Proxy Settings, and Startup Troubleshooting"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Apache Ant can be tuned before any build runs by setting environment variables. This guide is for build and DevOps engineers who want predictable Ant behavior across local machines and CI runners, and it covers exactly how <code>ANT_OPTS<\/code>, <code>ANT_ARGS<\/code>, and <code>JAVACMD<\/code> are used.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally published on 2010-04-14; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Source context: <a href=\"https:\/\/www.devopsschool.com\/blog\/usage-of-ant_opts-in-ant-script-ant_opts-capabilities\/\">Usage of ANT_OPTS in Ant Script | ANT_OPTS capabilities<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2010\/04\/ant_opts-in-ant-script.png\" alt=\"ANT_OPTS in Ant script\" class=\"wp-image-4239\" width=\"600\" height=\"400\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2010\/04\/ant_opts-in-ant-script.png 600w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2010\/04\/ant_opts-in-ant-script-300x200.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">What ANT_OPTS, ANT_ARGS, and JAVACMD do<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ant launcher scripts read environment variables and then start Java + Ant with those settings. The most useful variables are shown below.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Variable<\/th><th>What it affects<\/th><th>Typical value examples<\/th><th>Best use<\/th><\/tr><\/thead><tbody><tr><td>ANT_OPTS<\/td><td>JVM options for the Java process running Ant<\/td><td>-Xmx1024m, -Dlog.dir=\/var\/log\/build<\/td><td>Heap tuning and JVM system properties<\/td><\/tr><tr><td>ANT_ARGS<\/td><td>Default Ant command-line options<\/td><td>-verbose, -lib \/opt\/ant\/lib<\/td><td>Repeated Ant CLI flags<\/td><\/tr><tr><td>JAVACMD<\/td><td>Java executable Ant should run<\/td><td>\/path\/to\/java<\/td><td>Force a specific JVM\/JDK binary<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Runtime flow when you execute an Ant build<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is the high-level startup path that explains where each variable is applied.<\/p>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Set ANT_OPTS ANT_ARGS JAVACMD] --> B[Run ant command]\n    B --> C[Launcher script selects Java binary]\n    C --> D[Start JVM with ANT_OPTS]\n    D --> E[Ant reads ANT_ARGS and CLI args]\n    E --> F{Arguments valid}\n    F -- no --> G[Startup error and exit]\n    F -- yes --> H[Execute requested target]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Common ANT_OPTS use cases<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Set JVM heap for larger builds<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If dependency resolution, compilation, or large XML processing causes memory pressure, increase heap via <code>ANT_OPTS<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># Windows CMD<\/span>\nset ANT_OPTS=-Xms256m -Xmx1024m\nant clean compile\n\n<span class=\"hljs-comment\"># Linux\/macOS shell<\/span>\nexport ANT_OPTS=<span class=\"hljs-string\">\"-Xms256m -Xmx1024m\"<\/span>\nant clean compile<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Pass JVM system properties into Ant builds<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A common pattern is passing build-time properties through the JVM so the Ant build file can consume them.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># Windows CMD<\/span>\nset ANT_OPTS=-Dlog.dir=C:\\logs\nant run\n\n<span class=\"hljs-comment\"># Linux\/macOS shell<\/span>\nexport ANT_OPTS=<span class=\"hljs-string\">\"-Dlog.dir=\/var\/log\/myapp\"<\/span>\nant run<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\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\">project<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"demo\"<\/span> <span class=\"hljs-attr\">default<\/span>=<span class=\"hljs-string\">\"show-log-dir\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">target<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"show-log-dir\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">echo<\/span>&gt;<\/span>Log directory is set to: ${log.dir}<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>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">project<\/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\">Configure proxy settings for dependency downloads<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You can pass HTTP\/HTTPS proxy host and port as JVM properties when Ant must reach external repositories through a corporate proxy.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># Windows CMD<\/span>\nset ANT_OPTS=-Dhttp.proxyHost=myproxy -Dhttp.proxyPort=<span class=\"hljs-number\">3128<\/span> -Dhttps.proxyHost=myproxy -Dhttps.proxyPort=<span class=\"hljs-number\">3128<\/span>\nant mytarget\n\n<span class=\"hljs-comment\"># Linux\/macOS shell<\/span>\nexport ANT_OPTS=<span class=\"hljs-string\">\"-Dhttp.proxyHost=myproxy -Dhttp.proxyPort=3128 -Dhttps.proxyHost=myproxy -Dhttps.proxyPort=3128\"<\/span>\nant mytarget<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Troubleshooting invalid ANT_OPTS values<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If <code>ANT_OPTS<\/code> contains invalid JVM arguments, Ant may fail before your build starts.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Symptom 1:<\/strong> <code>Unrecognized option<\/code> and JVM startup failure.<\/li><li><strong>Symptom 2:<\/strong> <code>NoClassDefFoundError<\/code> if a malformed token is interpreted as a class name.<\/li><li><strong>Check:<\/strong> Print the current variable and confirm every token is a valid JVM option.<\/li><li><strong>Fix:<\/strong> Correct or clear <code>ANT_OPTS<\/code> and run Ant again.<\/li><\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># Inspect current value<\/span>\n<span class=\"hljs-comment\"># Windows CMD<\/span>\n<span class=\"hljs-keyword\">echo<\/span> %ANT_OPTS%\n\n<span class=\"hljs-comment\"># Linux\/macOS shell<\/span>\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"$ANT_OPTS\"<\/span>\n\n<span class=\"hljs-comment\"># Clear and retest<\/span>\n<span class=\"hljs-comment\"># Windows CMD<\/span>\nset ANT_OPTS=\nant -version\n\n<span class=\"hljs-comment\"># Linux\/macOS shell<\/span>\n<span class=\"hljs-keyword\">unset<\/span> ANT_OPTS\nant -version<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css language-text\"><span class=\"hljs-selector-tag\">Unrecognized<\/span> <span class=\"hljs-selector-tag\">option<\/span>: <span class=\"hljs-selector-tag\">-3<\/span>\n<span class=\"hljs-selector-tag\">Could<\/span> <span class=\"hljs-selector-tag\">not<\/span> <span class=\"hljs-selector-tag\">create<\/span> <span class=\"hljs-selector-tag\">the<\/span> <span class=\"hljs-selector-tag\">Java<\/span> <span class=\"hljs-selector-tag\">virtual<\/span> <span class=\"hljs-selector-tag\">machine<\/span>.\n\n<span class=\"hljs-selector-tag\">Exception<\/span> <span class=\"hljs-selector-tag\">in<\/span> <span class=\"hljs-selector-tag\">thread<\/span> \"<span class=\"hljs-selector-tag\">main<\/span>\" <span class=\"hljs-selector-tag\">java<\/span><span class=\"hljs-selector-class\">.lang<\/span><span class=\"hljs-selector-class\">.NoClassDefFoundError<\/span>: <span class=\"hljs-selector-tag\">error-string<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><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\">Best practices and common pitfalls<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Use <code>ANT_OPTS<\/code> only for <strong>JVM<\/strong> flags (memory, <code>-D<\/code> properties, GC\/JVM options).<\/li><li>Use <code>ANT_ARGS<\/code> for repeated <strong>Ant CLI<\/strong> flags, not JVM flags.<\/li><li>Use <code>JAVACMD<\/code> when you must pin Ant to a specific Java binary.<\/li><li>Avoid storing proxy credentials in plain text environment variables when possible; prefer CI secret management.<\/li><li>Document team-standard settings in build scripts or CI configuration to reduce machine-to-machine drift.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>ANT_OPTS passes JVM options to the Java process that runs Ant. This guide explains how ANT_OPTS differs from ANT_ARGS and JAVACMD, with practical examples for memory tuning, proxy setup, and startup error diagnosis.<\/p>\n","protected":false},"author":1,"featured_media":4239,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[12],"tags":[209,3795,3799,3801,3797,3798,3045,683,3796,3800,1122,3802,1806,938,213,3794],"class_list":["post-229","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-apache-ant","tag-ant","tag-ant-opts","tag-ant-opts-capabilities","tag-ant-opts-in-ant-script","tag-ant-opts-usage","tag-ant-opts-usage-in-ant-script","tag-ant-script","tag-apache-ant","tag-capabilities","tag-capabilities-of-ant-opts","tag-guide","tag-how-to-use-ant-opts-in-ant-script","tag-instruction","tag-reference","tag-tutorial","tag-usage"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/229","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=229"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/229\/revisions"}],"predecessor-version":[{"id":79059,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/229\/revisions\/79059"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4239"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=229"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=229"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=229"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}