{"id":379,"date":"2026-10-14T01:11:12","date_gmt":"2026-10-14T01:11:12","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2014\/09\/25\/release-artificats-with-maven-release-and-git-flow-plugins\/"},"modified":"2026-10-14T01:11:12","modified_gmt":"2026-10-14T01:11:12","slug":"release-artificats-with-maven-release-and-git-flow-plugins","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/release-artificats-with-maven-release-and-git-flow-plugins\/","title":{"rendered":"Maven Release Plugin vs Maven Git Flow Plugin for Artifact Releases"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Automating Maven releases reduces manual versioning, tagging, and deployment errors. This guide helps Java build and release engineers compare the Maven Release Plugin and Maven Git Flow Plugin, then choose a workflow that fits their branching model.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally published on 2014-09-25; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><img src='https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2014\/09\/artificats-with-maven-relea.png' alt='Artifacts release with Maven release and git flow plugins' \/><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Two Maven release plugins in scope<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original post names two commonly used approaches:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Maven Release Plugin<\/strong> for the classic Maven release lifecycle (<code>prepare<\/code> then <code>perform<\/code>).<\/li><li><strong>Maven Git Flow Plugin<\/strong> (JGit-Flow) for Git-flow-style branching and release automation from Maven goals.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">How the release workflows differ<\/h2>\n\n\n\n<pre class=\"mermaid\">\nflowchart LR\n    A[Code ready on main branch] --> B{Release approach}\n    B --> C[Maven Release prepare]\n    C --> D[Commit version updates and create tag]\n    D --> E[Maven Release perform]\n    E --> F[Deploy release artifacts]\n    B --> G[JGit Flow release start]\n    G --> H[Create release branch]\n    H --> I[JGit Flow release finish]\n    I --> J[Merge branches and create tag]\n    J --> F\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Maven Release Plugin: prepare and perform<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Maven Release Plugin automates repetitive release actions: checking for a clean workspace, updating versions, committing release metadata, creating a tag, and running the release build from the tag.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" 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\">-B<\/span> <span class=\"hljs-selector-tag\">release<\/span><span class=\"hljs-selector-pseudo\">:clean<\/span> <span class=\"hljs-selector-tag\">release<\/span><span class=\"hljs-selector-pseudo\">:prepare<\/span>\n<span class=\"hljs-selector-tag\">mvn<\/span> <span class=\"hljs-selector-tag\">-B<\/span> <span class=\"hljs-selector-tag\">release<\/span><span class=\"hljs-selector-pseudo\">:perform<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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<p class=\"wp-block-paragraph\">Example plugin configuration in <code>pom.xml<\/code>:<\/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\">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-release-plugin<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>YOUR_VERSION<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">configuration<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">tagNameFormat<\/span>&gt;<\/span>@{project.artifactId}-@{project.version}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">tagNameFormat<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">configuration<\/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><\/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\">Maven Git Flow Plugin: Git-flow-oriented release automation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The JGit-Flow Maven plugin family targets teams using Git-flow branches (for example, <code>develop<\/code>, <code>release\/*<\/code>, and <code>main<\/code>). It exposes Maven goals that map to Git-flow release steps.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" 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\">-B<\/span> <span class=\"hljs-selector-tag\">jgitflow<\/span><span class=\"hljs-selector-pseudo\">:release-start<\/span>\n<span class=\"hljs-selector-tag\">mvn<\/span> <span class=\"hljs-selector-tag\">-B<\/span> <span class=\"hljs-selector-tag\">jgitflow<\/span><span class=\"hljs-selector-pseudo\">:release-finish<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><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<p class=\"wp-block-paragraph\">Example <code>pom.xml<\/code> snippet (verify coordinates and goals for your chosen plugin distribution):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" 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\">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>external.atlassian.jgitflow<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>jgitflow-maven-plugin<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>YOUR_VERSION<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/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><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><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\">Side-by-side comparison<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Option<\/th><th>Best fit<\/th><th>Typical Maven goals<\/th><th>Strengths<\/th><th>Watch-outs<\/th><\/tr><\/thead><tbody><tr><td>Maven Release Plugin<\/td><td>Standard Maven release process without Git-flow branching rules<\/td><td><code>release:prepare<\/code>, <code>release:perform<\/code><\/td><td>Simple two-step model; widely documented in Maven docs<\/td><td>Can feel rigid for teams that require explicit release branch orchestration<\/td><\/tr><tr><td>Maven Git Flow Plugin (JGit-Flow)<\/td><td>Teams already following Git-flow branching conventions<\/td><td><code>jgitflow:release-start<\/code>, <code>jgitflow:release-finish<\/code><\/td><td>Aligns release tasks with Git-flow branch lifecycle<\/td><td>Plugin variants differ; coordinates, defaults, and maintenance status should be verified<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Choosing between them<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Choose <strong>Maven Release Plugin<\/strong> if your team wants a straightforward Maven-native release flow.<\/li><li>Choose <strong>Maven Git Flow Plugin<\/strong> if your team already enforces Git-flow and wants release goals that mirror branch operations.<\/li><li>In both cases, run releases from CI with a clean checkout and explicit credentials for SCM and artifact repositories.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Original references<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original post links the following resources:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"http:\/\/george-stathis.com\/2013\/11\/09\/painless-maven-project-releases-with-maven-gitflow-plugin\/\">Painless Maven project releases with maven-gitflow-plugin<\/a><\/li><li><a href=\"http:\/\/maven.apache.org\/maven-release\/maven-release-plugin\/examples\/prepare-release.html\">Maven Release Plugin: prepare release example<\/a><\/li><li><a href=\"http:\/\/stackoverflow.com\/questions\/4466714\/how-to-customise-the-tag-format-of-the-maven-release-plugin\">Customizing Maven Release Plugin tag format<\/a><\/li><li><a href=\"https:\/\/bitbucket.org\/atlassian\/jgit-flow\/wiki\/Home\">Atlassian JGit-Flow wiki home<\/a><\/li><li><a href=\"http:\/\/maven.apache.org\/maven-release\/maven-release-plugin\/examples\/prepare-release.html#Overriding_the_default_tag_name_format\">Overriding default tag name format<\/a><\/li><li><a href=\"http:\/\/www.fiveminutes.eu\/maven-release-plugin-8-tips-tricks\/\">Maven Release Plugin tips and tricks<\/a><\/li><li><a href=\"https:\/\/bitbucket.org\/atlassian\/jgit-flow\/wiki\/Home.wiki#!getting-the-plugin\">JGit-Flow plugin setup<\/a><\/li><li><a href=\"http:\/\/blogs.atlassian.com\/2013\/05\/maven-git-flow-plugin-for-better-releases\/\">Atlassian blog: Maven Git Flow plugin<\/a><\/li><li><a href=\"https:\/\/www.youtube.com\/watch?v=ZCfrNvu6nMc\">YouTube video referenced by the original page<\/a><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Pin plugin versions explicitly and document upgrade policy.<\/li><li>Protect release branches and tags with repository permissions.<\/li><li>Run release goals in CI\/CD pipelines, not from personal workstations.<\/li><li>Store repository credentials securely (CI secrets and encrypted Maven settings).<\/li><li>Dry-run on a non-production repository before first adoption.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Learn how Maven Release Plugin and Maven Git Flow Plugin automate Java artifact releases. Compare workflows, commands, and selection criteria for your branching strategy.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[],"class_list":["post-379","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/379","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=379"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/379\/revisions"}],"predecessor-version":[{"id":79259,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/379\/revisions\/79259"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=379"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=379"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=379"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}