{"id":233,"date":"2026-10-13T00:21:26","date_gmt":"2026-10-13T00:21:26","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2010\/04\/14\/introduction-of-maven\/"},"modified":"2026-10-13T00:21:26","modified_gmt":"2026-10-13T00:21:26","slug":"introduction-of-maven","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/introduction-of-maven\/","title":{"rendered":"Apache Maven Complete Guide: Concepts, Installation, settings.xml, and First Build"},"content":{"rendered":"\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\">Apache Maven is a build and project management tool centered around the <strong>pom.xml<\/strong>. This guide is for developers and DevOps engineers who need a practical baseline: what Maven does, how installation works, how settings are managed, and how to create and build a first project.<\/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\/maven-introduction.png\" alt=\"Maven introduction\" width=\"600\" height=\"400\" \/><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Useful original resources: Maven downloads at <a href=\"http:\/\/maven.apache.org\/download.html\">maven.apache.org\/download.html<\/a>, and the original linked video at <a href=\"https:\/\/www.youtube.com\/watch?v=ZCfrNvu6nMc\">YouTube<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What Maven is and why DevOps teams use it<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Maven is an Apache tool that standardizes how projects are built, tested, packaged, and published. It uses a declarative model in <strong>pom.xml<\/strong> so teams can share a common build process across repositories and environments.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Defines project metadata (group, artifact, version, packaging).<\/li><li>Resolves dependencies from local and remote repositories.<\/li><li>Runs standard lifecycle phases such as compile, test, and package.<\/li><li>Uses plugins for checks, reports, releases, and deployment workflows.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Maven philosophy: conventions over custom scripting<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original post compared Maven with Ant. That distinction is still useful: Maven emphasizes shared conventions and lifecycle phases, while Ant is task-oriented and script-driven.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Aspect<\/th><th>Maven<\/th><th>Ant<\/th><\/tr><\/thead><tbody><tr><td>Build style<\/td><td>Declarative model via pom.xml<\/td><td>Imperative target\/task scripting<\/td><\/tr><tr><td>Project structure<\/td><td>Convention-based default layout<\/td><td>User-defined layout<\/td><\/tr><tr><td>Dependencies<\/td><td>Built-in repository and transitive dependency resolution<\/td><td>Usually manual or via additional tooling<\/td><\/tr><tr><td>Team consistency<\/td><td>High, because lifecycle is standardized<\/td><td>Varies by project script design<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">How a Maven build flows<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When you run a Maven goal, Maven reads the POM, resolves artifacts, and executes lifecycle phases using configured plugins.<\/p>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Run mvn package] --> B[Read pom xml]\n    B --> C[Resolve dependencies in local repository]\n    C --> D{Artifacts missing}\n    D -- yes --> E[Download from remote repository]\n    D -- no --> F[Use local cache]\n    E --> G[Execute lifecycle phases]\n    F --> G\n    G --> H[Run tests and package artifact]\n    H --> I[Install artifact locally when requested]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Install Maven on Windows, Linux, and macOS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original article used Maven 2.2.1 and legacy OS examples. The modern process is still the same at a high level: install a JDK, install Maven, set environment variables, and verify from the command line.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Install a <strong>JDK<\/strong> (JRE alone is not enough).<\/li><li>Download Maven from <a href=\"http:\/\/maven.apache.org\/download.html\">the official download page<\/a>.<\/li><li>Extract Maven to a stable path.<\/li><li>Set <strong>JAVA_HOME<\/strong> and add Maven <strong>bin<\/strong> to <strong>PATH<\/strong>.<\/li><li>Verify using <strong>mvn -version<\/strong>.<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Example: Linux or macOS shell<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\"><span class=\"hljs-keyword\">export<\/span> JAVA_HOME=<span class=\"hljs-regexp\">\/path\/<\/span>to\/jdk\n<span class=\"hljs-keyword\">export<\/span> M2_HOME=<span class=\"hljs-regexp\">\/opt\/<\/span>apache-maven\n<span class=\"hljs-keyword\">export<\/span> PATH=$JAVA_HOME\/bin:$M2_HOME\/bin:$PATH\nmvn -version<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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<h3 class=\"wp-block-heading\">Example: Windows command prompt<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-batch\"><span class=\"hljs-keyword\">set<\/span> JAVA_HOME=C:\\Path\\To\\JDK\n<span class=\"hljs-keyword\">set<\/span> M2_HOME=C:\\Tools\\apache-maven\n<span class=\"hljs-keyword\">set<\/span> PATH=%JAVA_HOME%\\bin;%M2_HOME%\\bin;%PATH%\nmvn -version<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><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\">Configure environment-specific behavior with settings.xml<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Maven settings belong outside project source code. Typical uses include proxy setup, repository mirror configuration, and credentials for artifact download or deployment.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Global settings: <strong>$M2_HOME\/conf\/settings.xml<\/strong><\/li><li>User settings: <strong>${user.home}\/.m2\/settings.xml<\/strong><\/li><\/ul>\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\">localRepository<\/span>&gt;<\/span>\/opt\/maven-repo<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">localRepository<\/span>&gt;<\/span>\n\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">mirrors<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">mirror<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id<\/span>&gt;<\/span>internal-mirror<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">id<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">mirrorOf<\/span>&gt;<\/span>*<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">mirrorOf<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">url<\/span>&gt;<\/span>https:\/\/repo.example.com\/repository\/maven-public\/<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">url<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">mirror<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">mirrors<\/span>&gt;<\/span>\n\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servers<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">server<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id<\/span>&gt;<\/span>internal-mirror<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">id<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">username<\/span>&gt;<\/span>build-user<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">username<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">password<\/span>&gt;<\/span>${env.MAVEN_REPO_PASSWORD}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">password<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">server<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">servers<\/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 credentials out of <strong>pom.xml<\/strong> and out of source control; prefer environment variables or a secrets manager integrated with CI.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Create your first Maven project<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original article used <strong>archetype:create<\/strong> in its example. A commonly used modern pattern is <strong>archetype:generate<\/strong> with explicit coordinates.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=<span class=\"hljs-literal\">false<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><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<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">cd my-app\nmvn test\nmvn package<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" 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-SNAPSHOT<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<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">project<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><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\">Core POM identifiers to remember: <strong>groupId<\/strong>, <strong>artifactId<\/strong>, <strong>version<\/strong>, and <strong>packaging<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Common Maven commands at a glance<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Command<\/th><th>What it does<\/th><th>Typical use<\/th><\/tr><\/thead><tbody><tr><td>mvn clean<\/td><td>Removes previous build output<\/td><td>Fresh local or CI build<\/td><\/tr><tr><td>mvn test<\/td><td>Compiles and runs tests<\/td><td>Validate code changes quickly<\/td><\/tr><tr><td>mvn package<\/td><td>Builds artifact (for example JAR or WAR)<\/td><td>Create deployable package<\/td><\/tr><tr><td>mvn install<\/td><td>Publishes artifact to local repository<\/td><td>Local dependency reuse across projects<\/td><\/tr><tr><td>mvn deploy<\/td><td>Publishes artifact to remote repository<\/td><td>Release or CI\/CD publication<\/td><\/tr><tr><td>mvn dependency:tree<\/td><td>Prints resolved dependency graph<\/td><td>Troubleshoot conflicts and transitive pulls<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices and common pitfalls<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Pin critical plugin versions in your POM for reproducible builds.<\/li><li>Do not commit credentials in POM or settings files.<\/li><li>Use a repository manager mirror in enterprise environments to improve control and caching.<\/li><li>Use <strong>mvn dependency:tree<\/strong> early when debugging classpath issues.<\/li><li>Keep CI and local JDK\/Maven toolchains aligned to reduce environment drift.<\/li><li>Treat legacy Maven tutorials carefully, especially those tied to very old Maven and OS versions.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Learn what Maven is, how its lifecycle and POM model work, and how to install and configure it for team-friendly builds. This revised guide includes workflow diagrams, command references, and practical examples.<\/p>\n","protected":false},"author":1,"featured_media":4262,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[29],"tags":[3853,681,3848,3855,460,1322,161,3849,2265,3850,3851,3852,3854,2798,3847],"class_list":["post-233","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-maven","tag-about-maven","tag-apache-maven","tag-benefits-of-maven","tag-build-automation-tool","tag-linux","tag-mac-os-x","tag-maven","tag-maven-features","tag-maven-guide","tag-maven-installation-process","tag-maven-introduction","tag-maven-overview","tag-project-management","tag-solaris","tag-what-is-maven"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/233","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=233"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/233\/revisions"}],"predecessor-version":[{"id":79063,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/233\/revisions\/79063"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4262"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=233"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=233"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=233"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}