{"id":238,"date":"2026-10-13T01:10:51","date_gmt":"2026-10-13T01:10:51","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2010\/04\/14\/what-is-pom\/"},"modified":"2026-10-13T01:10:51","modified_gmt":"2026-10-13T01:10:51","slug":"what-is-pom","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/what-is-pom\/","title":{"rendered":"Maven POM Explained: Structure, Inheritance, and Practical pom.xml Examples"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In Maven, <strong>pom.xml<\/strong> is the fundamental project descriptor: it defines your artifact identity, dependencies, plugins, and build behavior. This guide is for engineers who use Maven in CI\/CD or local builds and want a clear, practical understanding of how POM configuration is resolved and executed.<\/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\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2010\/04\/pom.png\" alt=\"Maven POM diagram\" width=\"600\" height=\"400\" \/><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What a POM is and what Maven uses it for<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>Project Object Model (POM)<\/strong> is Maven\u2019s configuration model stored in <strong>pom.xml<\/strong>. When you run a Maven goal, Maven reads this file (from the current directory unless you pass <code>-f<\/code>) and uses it to determine how to build your project.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Project coordinates (groupId, artifactId, version)<\/li><li>Packaging type (for example, jar, war, pom)<\/li><li>Dependencies and dependency versions<\/li><li>Build plugins and plugin configuration<\/li><li>Profiles, repositories, metadata, and reporting settings<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Minimal POM: the required fields<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A minimal valid POM needs the project root plus these required elements: <strong>modelVersion<\/strong>, <strong>groupId<\/strong>, <strong>artifactId<\/strong>, and <strong>version<\/strong>. Together, groupId:artifactId:version form the artifact coordinates (GAV).<\/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\">modelVersion<\/span>&gt;<\/span>4.0.0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">modelVersion<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>com.mycompany.app<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>my-app<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>1.0.0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/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\">If you do not declare <strong>packaging<\/strong>, Maven uses <strong>jar<\/strong> by default.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Common pom.xml sections in real projects<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Most production POM files add dependency management, plugin configuration, and Java\/toolchain properties. A practical skeleton looks like this:<\/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>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">modelVersion<\/span>&gt;<\/span>4.0.0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">modelVersion<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>com.example<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>orders-service<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>1.0.0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">packaging<\/span>&gt;<\/span>jar<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">packaging<\/span>&gt;<\/span>\n\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">properties<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">maven.compiler.source<\/span>&gt;<\/span>17<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">maven.compiler.source<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">maven.compiler.target<\/span>&gt;<\/span>17<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">maven.compiler.target<\/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\">dependencies<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>org.slf4j<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>slf4j-api<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>2.0.0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependencies<\/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\">plugins<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugin<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>org.apache.maven.plugins<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>maven-compiler-plugin<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">plugin<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">plugins<\/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-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\">Super POM, parent POM, and project inheritance<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Maven applies inheritance in layers. Every project inherits from Maven\u2019s built-in <strong>Super POM<\/strong>. You can also define your own <strong>parent POM<\/strong> to standardize settings across multiple services or modules.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>POM type<\/th><th>Who defines it<\/th><th>What it controls<\/th><th>Typical use<\/th><\/tr><\/thead><tbody><tr><td>Super POM<\/td><td>Maven<\/td><td>Built-in defaults and baseline behavior<\/td><td>Implicit base for all Maven projects<\/td><\/tr><tr><td>Parent POM<\/td><td>Your org\/team<\/td><td>Shared plugin versions, repositories, dependency management, policies<\/td><td>Standardizing many projects<\/td><\/tr><tr><td>Project POM<\/td><td>Individual project<\/td><td>Service-specific dependencies and build config<\/td><td>Application-level customization<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Commonly merged\/inherited areas include dependencies, plugin lists, plugin configuration, resources, and (with matching IDs) plugin executions.<\/p>\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\">project<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">parent<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>com.example.build<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>platform-parent<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>1.0.0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">parent<\/span>&gt;<\/span>\n\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">modelVersion<\/span>&gt;<\/span>4.0.0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">modelVersion<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>com.example.services<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>billing-service<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>1.2.3<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/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<h2 class=\"wp-block-heading\">How Maven resolves and executes POM configuration<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The build configuration Maven actually executes is the <strong>effective POM<\/strong> (project POM + parent POM + Super POM + active profiles).<\/p>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Run mvn goal] --> B[Read project pom.xml]\n    B --> C[Resolve parent POM]\n    C --> D[Apply Super POM defaults]\n    D --> E[Build effective POM]\n    E --> F[Resolve dependencies and plugins]\n    F --> G[Execute lifecycle phase and goal]\n<\/pre>\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\"># Build using pom.xml in current directory<\/span>\nmvn clean package\n\n<span class=\"hljs-comment\"># Build with a specific POM file<\/span>\nmvn -f .\/path\/to\/pom.xml clean verify\n\n<span class=\"hljs-comment\"># Inspect the final merged configuration Maven sees<\/span>\nmvn help:effective-pom<\/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\">Best practices and common pitfalls<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Keep coordinates stable and meaningful; changing groupId\/artifactId impacts dependency consumers.<\/li><li>Centralize shared versions and plugin defaults in a parent POM for consistency.<\/li><li>Use <code>mvn help:effective-pom<\/code> when inheritance or profiles produce unexpected behavior.<\/li><li>Avoid duplicating plugin versions across many child projects.<\/li><li>Be explicit about repository usage and avoid unnecessary custom repositories when possible.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>The Project Object Model (POM) is Maven\u2019s central configuration file and the source of truth for how a Java project is built. This guide covers required fields, inheritance (Super POM and parent POM), and how Maven creates the effective build configuration.<\/p>\n","protected":false},"author":1,"featured_media":4279,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[3895,3897,3877,3900,3901,3893,3894,2339,3899,3898,719,3896,3892],"class_list":["post-238","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorised","tag-about-pom","tag-minimal-pom","tag-pom","tag-pom-guide","tag-pom-in-maven","tag-pom-introduction","tag-pom-overview","tag-project","tag-project-inheritance","tag-project-object-model","tag-start","tag-super-pom","tag-what-is-pom"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/238","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=238"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/238\/revisions"}],"predecessor-version":[{"id":79068,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/238\/revisions\/79068"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4279"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=238"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=238"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=238"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}