{"id":236,"date":"2026-10-13T00:51:05","date_gmt":"2026-10-13T00:51:05","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2010\/04\/14\/properties-in-maven\/"},"modified":"2026-10-13T00:51:05","modified_gmt":"2026-10-13T00:51:05","slug":"properties-in-maven","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/properties-in-maven\/","title":{"rendered":"Maven Properties Reference: project.*, settings.*, env.*, and Custom POM Values"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Maven properties let you reuse values across your build, parent POMs, profiles, plugins, and CI commands. This guide organizes the major property types, shows how interpolation works, and gives practical commands to inspect effective values.<\/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<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"400\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2010\/04\/properties-in-maven.png\" alt=\"Properties in Maven\" class=\"wp-image-4272\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2010\/04\/properties-in-maven.png 600w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2010\/04\/properties-in-maven-300x200.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">How Maven resolves properties<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Maven interpolates property expressions (for example, values like <code>${project.version}<\/code>) from multiple sources: the project model, parent model, settings, environment variables, JVM system properties, and user-defined values. In practice, this is what allows the same POM to behave correctly on local machines and CI agents.<\/p>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Read pom.xml] --> B[Load parent and super POM]\n    B --> C[Read active settings and profiles]\n    C --> D[Read JVM and environment values]\n    D --> E[Interpolate property expressions]\n    E --> F[Resolved values used by plugins and packaging]\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The exact effective value can vary by active profile, command-line flags, and plugin behavior, so validation with Maven CLI commands is important before relying on a property in release automation.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Property sources compared<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use this as a quick decision table when choosing where a value should come from.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Source<\/th><th>Example expression<\/th><th>Best used for<\/th><th>Notes<\/th><\/tr><\/thead><tbody><tr><td>Built-in project location<\/td><td>${basedir}<\/td><td>Relative paths in builds and plugins<\/td><td>Represents the directory containing <code>pom.xml<\/code>.<\/td><\/tr><tr><td>Project model (POM)<\/td><td>${project.version}<\/td><td>Artifact naming and plugin configuration<\/td><td><code>${pom.*}<\/code> forms are commonly seen as aliases in older content.<\/td><\/tr><tr><td>Build directories<\/td><td>${project.build.directory}<\/td><td>Output and generated files<\/td><td>Typically resolves to <code>target<\/code> unless overridden.<\/td><\/tr><tr><td>User settings<\/td><td>${settings.localRepository}<\/td><td>Repository paths and user-scoped config<\/td><td>Loaded from user\/global <code>settings.xml<\/code>.<\/td><\/tr><tr><td>Environment variables<\/td><td>${env.M2_HOME}<\/td><td>Host-specific runtime paths<\/td><td>Depends on variable presence in the shell\/agent environment.<\/td><\/tr><tr><td>Java system properties<\/td><td>${java.home}<\/td><td>JVM\/JDK-aware configuration<\/td><td>Comes from JVM system properties, not Maven POM fields.<\/td><\/tr><tr><td>Custom POM properties<\/td><td>${my.filter.value}<\/td><td>Team-defined reusable constants<\/td><td>Defined under <code>&lt;properties&gt;<\/code> in POM.<\/td><\/tr><tr><td>Parent model values<\/td><td>${project.parent.version}<\/td><td>Inheritance-aware builds<\/td><td>Useful in multi-module or corporate parent setups.<\/td><\/tr><tr><td>CLI user properties<\/td><td>-Dmy.filter.value=override<\/td><td>One-off overrides in CI\/CD<\/td><td>Good for pipeline-specific toggles and temporary overrides.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Frequently used property expressions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Project and build values<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>${basedir}<\/li><li>${project.name}<\/li><li>${project.version}<\/li><li>${project.build.directory}<\/li><li>${project.build.outputDirectory}<\/li><li>${project.build.finalName}<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Settings, environment, and JVM values<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>${settings.localRepository}<\/li><li>${env.M2_HOME}<\/li><li>${java.version}<\/li><li>${java.home}<\/li><li>${user.home}<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Parent POM values<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Parent values are accessed through the project model (for example, <code>${project.parent.version}<\/code>). For object-level context, the original post referenced the MavenProject API: <a href=\"http:\/\/maven.apache.org\/ref\/2.0.4\/maven-project\/apidocs\/org\/apache\/maven\/project\/MavenProject.html\">org.apache.maven.project.MavenProject<\/a>.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>${project.parent.groupId}<\/li><li>${project.parent.artifactId}<\/li><li>${project.parent.version}<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Define and override custom properties<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Define team-owned values once in <code>&lt;properties&gt;<\/code>, then reference them throughout plugins, resources, and build metadata.<\/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>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">properties<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">my.filter.value<\/span>&gt;<\/span>hello<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">my.filter.value<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifact.suffix<\/span>&gt;<\/span>internal<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifact.suffix<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">properties<\/span>&gt;<\/span>\n\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">build<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">finalName<\/span>&gt;<\/span>${project.artifactId}-${project.version}-${artifact.suffix}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">finalName<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">build<\/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<p class=\"wp-block-paragraph\">You can override a custom property at runtime from the command line, which is common in CI pipelines.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">mvn clean package -Dartifact.suffix=ci<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Inspect effective values from the CLI<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When in doubt, ask Maven directly for the evaluated result of a property expression.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">mvn help:evaluate -Dexpression=project.version\nmvn help:evaluate -Dexpression=project.build.directory\nmvn help:evaluate -Dexpression=settings.localRepository\nmvn help:evaluate -Dexpression=env.M2_HOME<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">To understand inherited values and profile effects, inspect the effective POM.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css language-bash\"><span class=\"hljs-selector-tag\">mvn<\/span> <span class=\"hljs-selector-tag\">help<\/span><span class=\"hljs-selector-pseudo\">:effective-pom<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><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\">Common pitfalls and best practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Prefer explicit <code>${project.*}<\/code> expressions for readability in modern builds.<\/li><li>Do not assume environment variables exist on every developer machine or CI runner.<\/li><li>Validate key properties with <code>help:evaluate<\/code> before release or deployment jobs.<\/li><li>Use custom properties for team conventions, then allow CI overrides with <code>-D<\/code> only where needed.<\/li><li>Be careful with older aliases and legacy examples from Maven 2-era posts.<\/li><li>In multi-module projects, confirm parent-derived values from the effective POM, not by assumption.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Maven properties are the backbone of reusable, environment-aware builds. This revised reference explains major property sources, interpolation flow, and practical commands for inspecting real values.<\/p>\n","protected":false},"author":1,"featured_media":4272,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[29],"tags":[3880,161,3878,3879,3871,3882,3873,3875,3881,3876,3874,3877,1073,3872],"class_list":["post-236","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-maven","tag-list-of-maven-properties","tag-maven","tag-maven-build-in-properties","tag-maven-pom-project-properties","tag-maven-properties","tag-maven-properties-cheatsheet","tag-maven-properties-guide","tag-maven-properties-instructions","tag-maven-properties-list","tag-maven-properties-references","tag-maven-properties-tutorials","tag-pom","tag-properties","tag-properties-in-maven"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/236","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=236"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/236\/revisions"}],"predecessor-version":[{"id":79066,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/236\/revisions\/79066"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4272"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=236"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=236"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=236"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}