{"id":141,"date":"2026-10-12T12:41:38","date_gmt":"2026-10-12T12:41:38","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2009\/06\/20\/set-unix-home-dir-property-using-ant\/"},"modified":"2026-10-12T12:41:38","modified_gmt":"2026-10-12T12:41:38","slug":"set-unix-home-dir-property-using-ant","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/set-unix-home-dir-property-using-ant\/","title":{"rendered":"Apache Ant: Set the Current User Home Directory with env.HOME (and Safe Fallbacks)"},"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\">If you maintain Apache Ant build files, you often need a reliable way to reference the current user\u2019s home directory for config files, cache paths, or generated artifacts. This guide shows the original <code>env.HOME<\/code> approach, when to prefer it, and how to add a safer fallback for mixed environments.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This article is an expanded, modernized version of the original note: <a href=\"https:\/\/www.devopsschool.com\/blog\/set-unix-home-dir-property-using-ant\/\">SET UNIX HOME DIR PROPERTY using ANT<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2009\/06\/set-unix-home-dir-property-.png\" alt=\"Original Ant HOME property example\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Set HOME from environment variables in Ant<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ant can import OS environment variables into properties using <code>&lt;property environment=&quot;env&quot;\/&gt;<\/code>. After that, an environment variable like <code>HOME<\/code> becomes available as <code>${env.HOME}<\/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\">project<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"test\"<\/span> <span class=\"hljs-attr\">default<\/span>=<span class=\"hljs-string\">\"myhome\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property<\/span> <span class=\"hljs-attr\">environment<\/span>=<span class=\"hljs-string\">\"env\"<\/span>\/&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">target<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"myhome\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">echo<\/span> <span class=\"hljs-attr\">message<\/span>=<span class=\"hljs-string\">\"My home is ${env.HOME}\"<\/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-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<h2 class=\"wp-block-heading\">How the property is resolved at runtime<\/h2>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Run ant target] --> B[Load env via property environment env]\n    B --> C{env.HOME available}\n    C -- yes --> D[Set home dir to env.HOME]\n    C -- no --> E[Fallback to user.home]\n    D --> F[Use home.dir in tasks]\n    E --> F\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Compare home-directory property options<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In practice, you usually choose between environment-based and JVM-based properties depending on where the build runs.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Property<\/th><th>Source<\/th><th>Best use case<\/th><th>Caveat<\/th><\/tr><\/thead><tbody><tr><td><code>${env.HOME}<\/code><\/td><td>OS environment variable<\/td><td>Unix\/Linux\/macOS shells and agents where HOME is set<\/td><td>Can be missing in non-interactive or locked-down CI environments<\/td><\/tr><tr><td><code>${user.home}<\/code><\/td><td>JVM system property<\/td><td>Portable fallback across platforms<\/td><td>Represents the JVM user context, which may differ from shell expectations<\/td><\/tr><tr><td><code>${env.USERPROFILE}<\/code><\/td><td>Windows environment variable<\/td><td>Native Windows build agents<\/td><td>Not available on Unix-like systems<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Use a portable Ant pattern with fallback<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The pattern below prefers <code>env.HOME<\/code> when present and falls back to <code>user.home<\/code>. It also echoes values for troubleshooting.<\/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\">project<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"home-demo\"<\/span> <span class=\"hljs-attr\">default<\/span>=<span class=\"hljs-string\">\"show-home\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property<\/span> <span class=\"hljs-attr\">environment<\/span>=<span class=\"hljs-string\">\"env\"<\/span>\/&gt;<\/span>\n\n    <span class=\"hljs-comment\">&lt;!-- Prefer HOME when available --&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">condition<\/span> <span class=\"hljs-attr\">property<\/span>=<span class=\"hljs-string\">\"home.dir\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"${env.HOME}\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">isset<\/span> <span class=\"hljs-attr\">property<\/span>=<span class=\"hljs-string\">\"env.HOME\"<\/span>\/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">condition<\/span>&gt;<\/span>\n\n    <span class=\"hljs-comment\">&lt;!-- Fallback to JVM-level home --&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"home.dir\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"${user.home}\"<\/span>\/&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">target<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"show-home\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">echo<\/span> <span class=\"hljs-attr\">message<\/span>=<span class=\"hljs-string\">\"env.HOME=${env.HOME}\"<\/span>\/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">echo<\/span> <span class=\"hljs-attr\">message<\/span>=<span class=\"hljs-string\">\"user.home=${user.home}\"<\/span>\/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">echo<\/span> <span class=\"hljs-attr\">message<\/span>=<span class=\"hljs-string\">\"home.dir=${home.dir}\"<\/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-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<h2 class=\"wp-block-heading\">Run and verify<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">ant -f build.xml show-home\nHOME=<span class=\"hljs-regexp\">\/tmp\/<\/span>demo ant -f build.xml show-home<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Common pitfalls<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Forgetting <code>&lt;property environment=&quot;env&quot;\/&gt;<\/code>, which makes <code>${env.HOME}<\/code> unavailable.<\/li><li>Assuming <code>HOME<\/code> is always defined in CI.<\/li><li>Expecting later property declarations to overwrite earlier ones; Ant properties are typically set once.<\/li><li>Using only Unix-style variables on Windows agents.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Standardize on a single internal property such as <code>home.dir<\/code>.<\/li><li>Prefer <code>env.HOME<\/code> when present, with <code>user.home<\/code> as a default.<\/li><li>Add a diagnostic target that echoes resolved path values.<\/li><li>Validate behavior on each build environment type (developer laptop, Linux CI, Windows CI).<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Learn how to read the logged-in user\u2019s home directory in Ant using env.HOME, then make it portable with a user.home fallback. Includes build.xml patterns you can use in local builds and CI.<\/p>\n","protected":false},"author":1,"featured_media":4091,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[4957],"tags":[209,3316,3313,3315,545,593,1073,1158,3317,3314,169,3318,1927],"class_list":["post-141","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux","tag-ant","tag-home-directory","tag-homedir","tag-homedir-in-build-xml","tag-how","tag-process","tag-properties","tag-set","tag-set-home-directory-properites-in-unix","tag-set-properties","tag-unix","tag-unix-home-dir-property-setting-by-ant","tag-using"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/141","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=141"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/141\/revisions"}],"predecessor-version":[{"id":78990,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/141\/revisions\/78990"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4091"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=141"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=141"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=141"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}