{"id":235,"date":"2026-10-13T00:41:25","date_gmt":"2026-10-13T00:41:25","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2010\/04\/14\/profiles-in-maven\/"},"modified":"2026-10-13T00:41:25","modified_gmt":"2026-10-13T00:41:25","slug":"profiles-in-maven","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/profiles-in-maven\/","title":{"rendered":"Maven Profiles in Practice: Definition, Activation, and Reliable Multi-Environment Builds"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Maven profiles let you keep one <code>pom.xml<\/code> while adapting builds for different environments such as local development, CI, testing, or production. You will learn where profiles can be defined, how activation works, and how to use profiles without hurting build portability.<\/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\">Reference basis: Apache Maven User Guide concepts for profiles, updated for practical DevOps usage. Original post: <a href=\"https:\/\/www.devopsschool.com\/blog\/profiles-in-maven\/\">Profiles in Maven \u2013 How to Build Maven Profile?<\/a>. Maven project site: <a href=\"https:\/\/maven.apache.org\/\">Apache Maven<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2010\/04\/profiles-in-maven.png\" alt=\"Profiles in Maven\" width=\"600\" height=\"400\" \/><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What Maven profiles are and when to use them<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A profile is a conditional block of Maven configuration. When active, it can add or override parts of the build (properties, dependencies, plugins, repositories, and more) for a specific context.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Use profiles when builds differ by environment (for example, local vs CI).<\/li><li>Use profiles to avoid maintaining multiple POM files with <code>-f<\/code>.<\/li><li>Prefer profiles for <em>complementary<\/em> configuration, not for creating unrelated builds from one project.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Where Maven profiles are defined<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Maven supports project, user, and global profile locations. Older Maven-era material also mentions a separate <code>profiles.xml<\/code> descriptor.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Profile type<\/th><th>Defined in<\/th><th>Scope<\/th><th>Typical use<\/th><\/tr><\/thead><tbody><tr><td>Per-project<\/td><td><code>pom.xml<\/code><\/td><td>Shared in source control<\/td><td>Project-specific dependencies, plugins, and properties<\/td><\/tr><tr><td>Per-user<\/td><td><code>${user.home}\/.m2\/settings.xml<\/code><\/td><td>Single developer or CI agent<\/td><td>Local paths, credentials references, machine-specific defaults<\/td><\/tr><tr><td>Global<\/td><td><code>${maven.home}\/conf\/settings.xml<\/code><\/td><td>All users of one Maven installation<\/td><td>Organization-wide defaults on managed hosts<\/td><\/tr><tr><td>Legacy descriptor<\/td><td><code>profiles.xml<\/code> in project base directory<\/td><td>Historical pattern<\/td><td>Seen in older Maven 2 documentation; verify current support<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">How profile activation works<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Profiles can be activated explicitly from the command line or automatically through activation rules (JDK, OS, property, file presence\/missing, or active-by-default behavior).<\/p>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Run mvn command] --> B[Load project profiles]\n    B --> C[Load user and global settings profiles]\n    C --> D{Any -P flags}\n    D -- Yes --> E[Apply explicit activate or deactivate]\n    D -- No --> F[Evaluate activation rules]\n    F --> G[Check jdk os property file conditions]\n    G --> H[Apply activeByDefault when applicable]\n    E --> I[Merge into effective pom]\n    H --> I\n    I --> J[Execute build lifecycle]\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Important behavior:<\/strong> a profile with <code>activeByDefault<\/code> is typically deactivated when another profile in the same POM becomes active.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Activation method<\/th><th>How to set it<\/th><th>Example<\/th><th>Best use<\/th><\/tr><\/thead><tbody><tr><td>Explicit CLI<\/td><td><code>-P<\/code> option<\/td><td><code>-Pdev,test<\/code><\/td><td>Temporary run-time choice<\/td><\/tr><tr><td>Settings default<\/td><td><code>&lt;activeProfiles&gt;<\/code> in settings.xml<\/td><td><code>&lt;activeProfile&gt;corp&lt;\/activeProfile&gt;<\/code><\/td><td>User or machine defaults<\/td><\/tr><tr><td>System property<\/td><td><code>&lt;activation&gt;&lt;property&gt;<\/code><\/td><td><code>-Denvironment=test<\/code><\/td><td>CI-driven environment selection<\/td><\/tr><tr><td>JDK<\/td><td><code>&lt;activation&gt;&lt;jdk&gt;<\/code><\/td><td><code>17<\/code> or range<\/td><td>JDK-specific build behavior<\/td><\/tr><tr><td>OS<\/td><td><code>&lt;activation&gt;&lt;os&gt;<\/code><\/td><td><code>&lt;family&gt;Windows&lt;\/family&gt;<\/code><\/td><td>Platform-specific tooling<\/td><\/tr><tr><td>File exists\/missing<\/td><td><code>&lt;activation&gt;&lt;file&gt;<\/code><\/td><td><code>&lt;missing&gt;target\/...&lt;\/missing&gt;<\/code><\/td><td>Generated-artifact or workspace checks<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Example profile configuration in pom.xml<\/h2>\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\">profiles<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">profile<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id<\/span>&gt;<\/span>dev<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">id<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">activation<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">activeByDefault<\/span>&gt;<\/span>true<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">activeByDefault<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">activation<\/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\">app.env<\/span>&gt;<\/span>dev<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">app.env<\/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\">profile<\/span>&gt;<\/span>\n\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">profile<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id<\/span>&gt;<\/span>test<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">id<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">activation<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">name<\/span>&gt;<\/span>environment<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">name<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">value<\/span>&gt;<\/span>test<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">value<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">property<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">activation<\/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\">app.env<\/span>&gt;<\/span>test<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">app.env<\/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\">profile<\/span>&gt;<\/span>\n\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">profile<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id<\/span>&gt;<\/span>windows-build<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">id<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">activation<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">os<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">family<\/span>&gt;<\/span>Windows<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">family<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">os<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">activation<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">profile<\/span>&gt;<\/span>\n\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">profile<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id<\/span>&gt;<\/span>generate-wsdl<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">id<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">activation<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">file<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">missing<\/span>&gt;<\/span>target\/generated-sources\/wsdl.marker<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">missing<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">file<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">activation<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">profile<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">profiles<\/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\">For environment variables, Maven exposes them as properties prefixed with <code>env.<\/code> (for example, <code>env.FOO<\/code>).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Command-line usage: activate, deactivate, inspect<\/h2>\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\"># Activate one or more profiles<\/span>\nmvn clean package -Pdev\nmvn clean verify -Pdev,test\n\n<span class=\"hljs-comment\"># Trigger property-based activation<\/span>\nmvn clean verify -Denvironment=test\n\n<span class=\"hljs-comment\"># Deactivate profiles (quote ! in shells that treat it specially)<\/span>\nmvn clean package -P <span class=\"hljs-string\">'!dev'<\/span>\nmvn clean package -P <span class=\"hljs-string\">'!dev,!windows-build'<\/span>\n\n<span class=\"hljs-comment\"># Inspect profile resolution<\/span>\nmvn help:active-profiles\nmvn help:all-profiles<\/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\n<h2 class=\"wp-block-heading\">Using settings.xml for user or machine-specific profiles<\/h2>\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\">settings<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">activeProfiles<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">activeProfile<\/span>&gt;<\/span>corp-network<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">activeProfile<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">activeProfiles<\/span>&gt;<\/span>\n\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">profiles<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">profile<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id<\/span>&gt;<\/span>corp-network<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">id<\/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\">repo.mirror.enabled<\/span>&gt;<\/span>true<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">repo.mirror.enabled<\/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\">profile<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">profiles<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">settings<\/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<p class=\"wp-block-paragraph\">Keep secrets and machine-only values in settings files, not in project <code>pom.xml<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices for reliable team builds<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Prefer profile-driven properties over hardcoded absolute filesystem paths.<\/li><li>Use clear profile IDs such as <code>dev<\/code>, <code>test<\/code>, <code>ci<\/code>, <code>prod<\/code>.<\/li><li>Avoid unnecessary changes to artifact coordinates across profiles.<\/li><li>Document which profiles CI uses, and verify with <code>mvn help:active-profiles<\/code>.<\/li><li>Keep team-shared behavior in <code>pom.xml<\/code>; keep user\/machine behavior in <code>settings.xml<\/code>.<\/li><li>Treat legacy <code>profiles.xml<\/code> usage as technical debt and confirm support before relying on it.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Maven profiles let you customize one build for multiple environments without cloning POM files. This guide covers profile types, activation methods, CLI usage, and team-safe best practices.<\/p>\n","protected":false},"author":1,"featured_media":4268,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[29],"tags":[3864,3863,3870,161,3865,3867,3868,3866,3869,3861,3860,3862,818],"class_list":["post-235","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-maven","tag-build-profile","tag-build-profiles-in-maven","tag-how-to-build-maven-profile","tag-maven","tag-maven-profile-guide","tag-maven-profile-instructions","tag-maven-profile-references","tag-maven-profile-tutorials","tag-maven-profile-user-guide","tag-maven-profiles","tag-profiles","tag-profiles-in-maven","tag-trigger"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/235","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=235"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/235\/revisions"}],"predecessor-version":[{"id":79065,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/235\/revisions\/79065"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4268"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=235"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=235"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=235"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}