{"id":1736,"date":"2021-09-23T15:43:51","date_gmt":"2021-09-23T15:43:51","guid":{"rendered":"https:\/\/blog.samarthya.me\/wps\/?p=1736"},"modified":"2021-09-23T16:46:35","modified_gmt":"2021-09-23T16:46:35","slug":"building-your-artifacts","status":"publish","type":"post","link":"https:\/\/blog.samarthya.me\/wps\/2021\/09\/23\/building-your-artifacts\/","title":{"rendered":"Building your artifact(s)"},"content":{"rendered":"\n<p>Everything starts form <code>a single source file<\/code> and as the time goes by, it gradually transforms into multiple modules, bulky source files and a source control repository. Mostly by this time the team has already adopted a a build tool, and a repository to publish the versioned <code>artifacts.<\/code> Journey is similar for every project successful or not.<\/p>\n\n\n\n<p>The choice of tools can be pre-defined or adopted as explored, but the last step is almost similar for everyone, where you have to publish a release binary. <\/p>\n\n\n\n<p>In this blog, I will try to talk about the last step only, as the other tools and choices have already been made for me and I am just publishing a convenient way of building &amp; publishing your artifacts in a <code>JFrog<\/code> repository.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tools<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><code>JFrog<\/code> repository to store the <code>snapshot<\/code> and <code>release<\/code> versions.<\/li><li>User account that has pubilsh\/delete access to these repo(s)<\/li><li>Maven as the build tool<\/li><li>Java OpenJDK preferably<\/li><li>Any IDE ( I use IntelliJ )<\/li><li>Access to GitHub (User name and Personal Access Token)<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">mvn: Version<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>mvn -version\nApache Maven 3.8.2 (ea98e05a04480131370aa0c110b8c54cf726c06f)\nMaven home: \/usr\/local\/Cellar\/maven\/3.8.2\/libexec\nJava version: 17, vendor: Homebrew, runtime: \/usr\/local\/Cellar\/openjdk\/17\/libexec\/openjdk.jdk\/Contents\/Home\nDefault locale: en_IN, platform encoding: UTF-8\nOS name: \"mac os x\", version: \"10.15.7\", arch: \"x86_64\", family: \"mac\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Java: version<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>java -version\nopenjdk version \"16.0.1\" 2021-04-20\nOpenJDK Runtime Environment AdoptOpenJDK-16.0.1+9 (build 16.0.1+9)\nOpenJDK 64-Bit Server VM AdoptOpenJDK-16.0.1+9 (build 16.0.1+9, mixed mode, sharing)<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Project Setup (GITHUB)<\/h2>\n\n\n\n<p>I will be using the source code from the location mentioned below<\/p>\n\n\n\n<figure class=\"wp-block-pullquote has-background has-luminous-vivid-orange-background-color is-style-solid-color\"><blockquote class=\"has-text-color has-white-color\"><p>All the source code is pushed <a href=\"https:\/\/github.com\/samarthya\/release-demo.git\" data-type=\"URL\" data-id=\"https:\/\/github.com\/samarthya\/release-demo.git\">here<\/a>.<\/p><\/blockquote><\/figure>\n\n\n\n<p>To create a personal access token (<a href=\"https:\/\/blog.samarthya.me\/wps\/2021\/09\/23\/personal-access-token\/\" data-type=\"URL\" data-id=\"https:\/\/blog.samarthya.me\/wps\/2021\/09\/23\/personal-access-token\/\">you can find steps here<\/a>) that shall be used in the <code>server.xml<\/code> for scm settings please refer to documentation <a href=\"https:\/\/docs.github.com\/en\/enterprise-server@3.1\/authentication\/keeping-your-account-and-data-secure\/creating-a-personal-access-token\" data-type=\"URL\" data-id=\"https:\/\/docs.github.com\/en\/enterprise-server@3.1\/authentication\/keeping-your-account-and-data-secure\/creating-a-personal-access-token\">here<\/a>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mvn scm:checkout -DconnectionUrl=scm:git:https:\/\/github.com\/samarthya\/release-demo.git -DscmVersion=main -DscmVersionType=branch -DcheckoutDirectory=.<\/code><\/pre>\n\n\n\n<p>It will checkout the code in the current directory. (More information available <a href=\"https:\/\/maven.apache.org\/scm\/maven-scm-plugin\/index.html\" data-type=\"URL\" data-id=\"https:\/\/maven.apache.org\/scm\/maven-scm-plugin\/index.html\">here<\/a>)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">JFrog repository<\/h2>\n\n\n\n<p>This repo shall have all the artifacts we wish to publish<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"276\" src=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/Screenshot-2021-09-23-at-5.44.57-PM-1024x276.png\" alt=\"\" class=\"wp-image-1737\" srcset=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/Screenshot-2021-09-23-at-5.44.57-PM-1024x276.png 1024w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/Screenshot-2021-09-23-at-5.44.57-PM-300x81.png 300w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/Screenshot-2021-09-23-at-5.44.57-PM-768x207.png 768w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/Screenshot-2021-09-23-at-5.44.57-PM-1536x414.png 1536w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/Screenshot-2021-09-23-at-5.44.57-PM-2048x553.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>A shout out to @JFROG for providing the trial license that helped me build the repo a docker deployment<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>root@docker&gt;docker ps\nCONTAINER ID   IMAGE                                                            COMMAND                  CREATED         STATUS       PORTS                                                                                                                                                                                        NAMES\n51b8aba2293b   releases-docker.jfrog.io\/jfrog\/xray-analysis:3.27.4              \".\/bin\/wrapper.sh\"       13 days ago     Up 13 days                                                                                                                                                                                                xray_analysis\na948186f1326   releases-docker.jfrog.io\/jfrog\/xray-indexer:3.27.4               \".\/bin\/wrapper.sh\"       13 days ago     Up 13 days                                                                                                                                                                                                xray_indexer\n0a6671c91fec   releases-docker.jfrog.io\/jfrog\/xray-persist:3.27.4               \".\/bin\/wrapper.sh\"       13 days ago     Up 13 days                                                                                                                                                                                                xray_persist\n7142c819fd51   releases-docker.jfrog.io\/jfrog\/xray-server:3.27.4                \".\/bin\/wrapper.sh\"       13 days ago     Up 13 days                                                                                                                                                                                                xray_server\n8e4309d97e51   releases-docker.jfrog.io\/jfrog\/artifactory-pro:7.25.6            \"\/entrypoint-artifac\u2026\"   13 days ago     Up 13 days   0.0.0.0:8081-8082-&gt;8081-8082\/tcp, :::8081-8082-&gt;8081-8082\/tcp                                                                                                                                artifactory\n5507e78cca13   releases-docker.jfrog.io\/jfrog\/router:7.21.4                     \"\/opt\/jfrog\/router\/a\u2026\"   13 days ago     Up 13 days   8082\/tcp, 0.0.0.0:8083-&gt;8083\/tcp, :::8083-&gt;8083\/tcp                                                                                                                                          xray_router\n20b266981815   releases-docker.jfrog.io\/postgres:13.2-alpine                    \"docker-entrypoint.s\u2026\"   13 days ago     Up 13 days   0.0.0.0:5432-&gt;5432\/tcp, :::5432-&gt;5432\/tcp                                                                                                                                                    postgresql\n23a68fd1c8f5   releases-docker.jfrog.io\/jfrog\/xray-rabbitmq:3.8.14-management   \"\/bin\/bash -c ' (\/se\u2026\"   13 days ago     Up 13 days   5671\/tcp, 0.0.0.0:4369-&gt;4369\/tcp, :::4369-&gt;4369\/tcp, 15671\/tcp, 10.109.34.77:5672-&gt;5672\/tcp, 0.0.0.0:15672-&gt;15672\/tcp, :::15672-&gt;15672\/tcp, 15691-15692\/tcp, 10.109.34.77:25672-&gt;25672\/tcp   xray_rabbitmq<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">SCM: pom.xml<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code> &lt;scm&gt;\n        &lt;developerConnection&gt;scm:git:${project.scm.url}&lt;\/developerConnection&gt;\n        &lt;connection&gt;scm:git:${project.scm.url}&lt;\/connection&gt;\n        &lt;url&gt;https:\/\/github.com\/samarthya\/release-demo.git&lt;\/url&gt;\n  &lt;\/scm&gt;<\/code><\/pre>\n\n\n\n<p>The repository for source goes into the SCM <code>connection<\/code> and <code>developerConnection<\/code>.<\/p>\n\n\n\n<p>Before I walk through the process of how you can use a release and snapShot build let&#8217;s have a look at the <code>release<\/code> plugin and the <code>POM<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-pullquote has-background has-luminous-vivid-orange-background-color is-style-solid-color\"><blockquote class=\"has-text-color has-white-color\"><p>Official documentation for <a href=\"https:\/\/maven.apache.org\/maven-release\/maven-release-plugin\/index.html\" data-type=\"URL\" data-id=\"https:\/\/maven.apache.org\/maven-release\/maven-release-plugin\/index.html\">maven-release-plugin<\/a><\/p><\/blockquote><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">maven-release-plugin<\/h2>\n\n\n\n<p>Releasing is a two step process <\/p>\n\n\n\n<ol class=\"wp-block-list\"><li><a href=\"https:\/\/maven.apache.org\/maven-release\/maven-release-plugin\/prepare-mojo.html\" data-type=\"URL\" data-id=\"https:\/\/maven.apache.org\/maven-release\/maven-release-plugin\/prepare-mojo.html\">Prepare release<\/a> &amp;<\/li><li><a href=\"https:\/\/maven.apache.org\/maven-release\/maven-release-plugin\/perform-mojo.html\" data-type=\"URL\" data-id=\"https:\/\/maven.apache.org\/maven-release\/maven-release-plugin\/perform-mojo.html\">Perform release<\/a><\/li><\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><code>mvn <a href=\"release:prepare\">release:prepare<\/a><\/code><\/h2>\n\n\n\n<p>Steps through several phases to ensure the POM is ready to be released and then prepares SCM to eventually contain a tagged version of the release and a record in the local copy of the parameters used.<\/p>\n\n\n\n<p>In case of error and if you need to run again you can use<\/p>\n\n\n\n<p><code>mvn release:prepare -Dresume=false<\/code><\/p>\n\n\n\n<p>or you can use <code>mvn release:clean<\/code><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><code>mvn release:perform<\/code><\/h2>\n\n\n\n<p>After completion of the previous step (no failure) you can perform the release. (<a href=\"https:\/\/maven.apache.org\/maven-release\/maven-release-plugin\/examples\/perform-release.html\" data-type=\"URL\" data-id=\"https:\/\/maven.apache.org\/maven-release\/maven-release-plugin\/examples\/perform-release.html\">Examples<\/a>)<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><code>POM.xml<\/code><\/h2>\n\n\n\n<p>Wont go into each plugin details here but just for reference you can identify the <code><meta charset=\"utf-8\">maven-enforcer-plugin<\/code> which enforces the <code>maven<\/code> and <code>JDK<\/code> version requirements<\/p>\n\n\n\n<pre class=\"wp-block-code has-normal-font-size\"><code><meta charset=\"utf-8\">&lt;plugin&gt;\n                &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n                &lt;artifactId&gt;maven-enforcer-plugin&lt;\/artifactId&gt;\n                &lt;version&gt;${maven.enforcer.version}&lt;\/version&gt;\n                &lt;executions&gt;\n                    &lt;execution&gt;\n                        &lt;id&gt;enforce-matching-compiler-target-and-bundle-required-execution-environment&lt;\/id&gt;\n                        &lt;phase&gt;validate&lt;\/phase&gt;\n                    &lt;\/execution&gt;\n                    &lt;execution&gt;\n                        &lt;id&gt;enforce-build-tools-versions&lt;\/id&gt;\n                        &lt;goals&gt;\n                            &lt;goal&gt;enforce&lt;\/goal&gt;\n                        &lt;\/goals&gt;\n                        &lt;configuration&gt;\n                            &lt;rules&gt;\n                                &lt;requireJavaVersion&gt;\n                                    &lt;version&gt;&#91;11,)&lt;\/version&gt;\n                                    &lt;message&gt;Invalid Java Version (min 11)\n                                    &lt;\/message&gt;\n                                &lt;\/requireJavaVersion&gt;\n                                &lt;requireMavenVersion&gt;\n                                    &lt;version&gt;&#91;3.6.2,)&lt;\/version&gt;\n                                    &lt;message&gt;Invalid Maven Version. (min 3.6.2)\n                                    &lt;\/message&gt;\n                                &lt;\/requireMavenVersion&gt;\n                                &lt;banDuplicatePomDependencyVersions \/&gt;\n                            &lt;\/rules&gt;\n                            &lt;fail&gt;true&lt;\/fail&gt;\n                        &lt;\/configuration&gt;\n                    &lt;\/execution&gt;\n                &lt;\/executions&gt;\n            &lt;\/plugin&gt;\n<\/code><\/pre>\n\n\n\n<p>You can also see the plugin for maven-release-plugin with <a href=\"http:\/\/maven.apache.org\/guides\/mini\/guide-configuring-plugins.html\" data-type=\"URL\" data-id=\"http:\/\/maven.apache.org\/guides\/mini\/guide-configuring-plugins.html\">configuration<\/a> as below.<\/p>\n\n\n\n<pre class=\"wp-block-code has-normal-font-size\"><code><meta charset=\"utf-8\">                &lt;plugin&gt;\n                    &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n                    &lt;artifactId&gt;maven-release-plugin&lt;\/artifactId&gt;\n                    &lt;version&gt;${maven.release.version}&lt;\/version&gt;\n                    &lt;configuration&gt;\n                        &lt;scmCommentPrefix&gt;&#91;scm bot]&lt;\/scmCommentPrefix&gt;\n                        &lt;tagNameFormat&gt;@{project.version}&lt;\/tagNameFormat&gt;\n                        &lt;encoding&gt;UTF-8&lt;\/encoding&gt;\n                    &lt;\/configuration&gt;\n                &lt;\/plugin&gt;<\/code><\/pre>\n\n\n\n<p>Where,<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><code>scmCommentPrefix<\/code> &#8211; The message prefix to use for all SCM changes.<\/li><li><code>tagNameFormat<\/code> &#8211; Format to use when generating the tag name. <\/li><\/ul>\n\n\n\n<p>If you are not using <code>setting.xml<\/code> for the SCM you can also use <code>username<\/code> and <code>password<\/code> to specify the credentials. In my example I am using the setting.xml.<\/p>\n\n\n\n<pre class=\"wp-block-code has-normal-font-size\"><code>      &lt;server&gt;\n         &lt;id&gt;github.com&lt;\/id&gt;\n         &lt;username&gt;&lt;myusername&gt;&lt;\/username&gt;\n         &lt;password&gt;&lt;my token&gt;&lt;\/password&gt;\n      &lt;\/server&gt;<\/code><\/pre>\n\n\n\n<p>The complete source code is available in <a href=\"https:\/\/github.com\/samarthya\/release-demo.git\" data-type=\"URL\" data-id=\"https:\/\/github.com\/samarthya\/release-demo.git\">github<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Main <code><a href=\"https:\/\/raw.githubusercontent.com\/samarthya\/release-demo\/main\/pom.xml\" data-type=\"URL\" data-id=\"https:\/\/raw.githubusercontent.com\/samarthya\/release-demo\/main\/pom.xml\">pom.xml<\/a><\/code><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;build&gt;\n        &lt;pluginManagement&gt;\n            &lt;plugins&gt;\n                &lt;plugin&gt;\n                    &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n                    &lt;artifactId&gt;maven-resources-plugin&lt;\/artifactId&gt;\n                    &lt;version&gt;${maven.resources.plugin.version}&lt;\/version&gt;\n                    &lt;configuration&gt;\n                        &lt;encoding&gt;UTF-8&lt;\/encoding&gt;\n                    &lt;\/configuration&gt;\n                &lt;\/plugin&gt;\n\n                &lt;plugin&gt;\n                    &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n                    &lt;artifactId&gt;maven-compiler-plugin&lt;\/artifactId&gt;\n                    &lt;version&gt;${maven.compiler.plugin.version}&lt;\/version&gt;\n                    &lt;configuration&gt;\n                        &lt;encoding&gt;UTF-8&lt;\/encoding&gt;\n                    &lt;\/configuration&gt;\n                &lt;\/plugin&gt;\n\n                &lt;plugin&gt;\n                    &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n                    &lt;artifactId&gt;maven-release-plugin&lt;\/artifactId&gt;\n                    &lt;version&gt;${maven.release.version}&lt;\/version&gt;\n                    &lt;configuration&gt;\n                        &lt;scmCommentPrefix&gt;&#91;scm bot]&lt;\/scmCommentPrefix&gt;\n                        &lt;tagNameFormat&gt;@{project.version}&lt;\/tagNameFormat&gt;\n                        &lt;encoding&gt;UTF-8&lt;\/encoding&gt;\n                    &lt;\/configuration&gt;\n                &lt;\/plugin&gt;\n            &lt;\/plugins&gt;\n        &lt;\/pluginManagement&gt;\n\n        &lt;plugins&gt;\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n                &lt;artifactId&gt;maven-enforcer-plugin&lt;\/artifactId&gt;\n                &lt;version&gt;${maven.enforcer.version}&lt;\/version&gt;\n                &lt;executions&gt;\n                    &lt;execution&gt;\n                        &lt;id&gt;enforce-matching-compiler-target-and-bundle-required-execution-environment&lt;\/id&gt;\n                        &lt;phase&gt;validate&lt;\/phase&gt;\n                    &lt;\/execution&gt;\n                    &lt;execution&gt;\n                        &lt;id&gt;enforce-build-tools-versions&lt;\/id&gt;\n                        &lt;goals&gt;\n                            &lt;goal&gt;enforce&lt;\/goal&gt;\n                        &lt;\/goals&gt;\n                        &lt;configuration&gt;\n                            &lt;rules&gt;\n                                &lt;requireJavaVersion&gt;\n                                    &lt;version&gt;&#91;11,)&lt;\/version&gt;\n                                    &lt;message&gt;Invalid Java Version. It should be Java 11.0.x at\n                                        least.\n                                    &lt;\/message&gt;\n                                &lt;\/requireJavaVersion&gt;\n                                &lt;requireMavenVersion&gt;\n                                    &lt;version&gt;&#91;3.6.2,)&lt;\/version&gt;\n                                    &lt;message&gt;Invalid Maven Version. It should be Maven 3.6.2 at\n                                        least.\n                                    &lt;\/message&gt;\n                                &lt;\/requireMavenVersion&gt;\n                                &lt;banDuplicatePomDependencyVersions \/&gt;\n                            &lt;\/rules&gt;\n                            &lt;fail&gt;true&lt;\/fail&gt;\n                        &lt;\/configuration&gt;\n                    &lt;\/execution&gt;\n                &lt;\/executions&gt;\n            &lt;\/plugin&gt;\n\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n                &lt;artifactId&gt;maven-source-plugin&lt;\/artifactId&gt;\n                &lt;version&gt;${maven.source.plugin.version}&lt;\/version&gt;\n                &lt;executions&gt;\n                    &lt;execution&gt;\n                        &lt;id&gt;attach-sources&lt;\/id&gt;\n                        &lt;goals&gt;\n                            &lt;goal&gt;jar&lt;\/goal&gt;\n                        &lt;\/goals&gt;\n                    &lt;\/execution&gt;\n                &lt;\/executions&gt;\n            &lt;\/plugin&gt;\n\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n                &lt;artifactId&gt;maven-javadoc-plugin&lt;\/artifactId&gt;\n                &lt;version&gt;${maven.javadoc.plugin.version}&lt;\/version&gt;\n                &lt;configuration&gt;\n                    &lt;encoding&gt;UTF-8&lt;\/encoding&gt;\n                    &lt;author&gt;true&lt;\/author&gt;\n\n                &lt;\/configuration&gt;\n                &lt;executions&gt;\n                    &lt;execution&gt;\n                        &lt;id&gt;attach-javadocs&lt;\/id&gt;\n                        &lt;goals&gt;\n                            &lt;goal&gt;jar&lt;\/goal&gt;\n                        &lt;\/goals&gt;\n                    &lt;\/execution&gt;\n                &lt;\/executions&gt;\n            &lt;\/plugin&gt;\n\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n                &lt;artifactId&gt;maven-scm-plugin&lt;\/artifactId&gt;\n                &lt;version&gt;${maven.scm.plugin.version}&lt;\/version&gt;\n                &lt;configuration&gt;\n                    &lt;goals&gt;install&lt;\/goals&gt;\n                &lt;\/configuration&gt;\n            &lt;\/plugin&gt;\n\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n                &lt;artifactId&gt;maven-surefire-plugin&lt;\/artifactId&gt;\n                &lt;version&gt;${maven.surefire.version}&lt;\/version&gt;\n                &lt;configuration&gt;\n                    &lt;encoding&gt;UTF-8&lt;\/encoding&gt;\n                &lt;\/configuration&gt;\n            &lt;\/plugin&gt;\n\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n                &lt;artifactId&gt;spring-boot-maven-plugin&lt;\/artifactId&gt;\n                &lt;version&gt;${spring.boot.version}&lt;\/version&gt;\n                &lt;executions&gt;\n                    &lt;execution&gt;\n                        &lt;goals&gt;\n                            &lt;goal&gt;repackage&lt;\/goal&gt;\n                        &lt;\/goals&gt;\n                    &lt;\/execution&gt;\n                &lt;\/executions&gt;\n            &lt;\/plugin&gt;\n        &lt;\/plugins&gt;\n    &lt;\/build&gt;<\/code><\/pre>\n\n\n\n<p>Now, it is time to use the plugin to <code>prepare<\/code> and <code>perform<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 0<\/h2>\n\n\n\n<p>Check the snapshot version currently marked in the <code>pom.xml<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mvn -Dexec.executable='echo' -Dexec.args='${project.groupId}:${project.version}:${project.artifactId}:${project.packaging}' exec:exec -q<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code has-medium-font-size\"><code>me.samarthya:1.0.1-SNAPSHOT:release-demo:jar<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1<\/h2>\n\n\n\n<p><code>mvn release:prepare<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mvn release:prepare\n&#91;INFO] Scanning for projects...\n&#91;INFO] \n&#91;INFO] ---------------------&lt; me.samarthya:release-demo &gt;----------------------\n&#91;INFO] Building release-demo 1.0.1-SNAPSHOT\n&#91;INFO] --------------------------------&#91; jar ]---------------------------------\n&#91;INFO] \n&#91;INFO] --- maven-release-plugin:3.0.0-M4:prepare (default-cli) @ release-demo ---\n&#91;INFO] phase verify-release-configuration\n&#91;INFO] starting prepare goal, composed of 17 phases: check-poms, scm-check-modifications, check-dependency-snapshots, create-backup-poms, map-release-versions, input-variables, map-development-versions, rewrite-poms-for-release, generate-release-poms, run-preparation-goals, scm-commit-release, scm-tag, rewrite-poms-for-development, remove-release-poms, run-completion-goals, scm-commit-development, end-release\n&#91;INFO] &#91;prepare] 1\/17 check-poms\n&#91;INFO] &#91;prepare] 2\/17 scm-check-modifications\n&#91;INFO] Verifying that there are no local modifications...<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;INFO] &#91;prepare] 4\/17 create-backup-poms\n&#91;INFO] &#91;prepare] 5\/17 map-release-versions\nWhat is the release version for \"release-demo\"? (me.samarthya:release-demo) 1.0.1: : \n&#91;INFO] &#91;prepare] 6\/17 input-variables\nWhat is the SCM release tag or label for \"release-demo\"? (me.samarthya:release-demo) 1.0.1: : v1.0.1\n&#91;INFO] &#91;prepare] 7\/17 map-development-versions\nWhat is the new development version for \"release-demo\"? (me.samarthya:release-demo) 1.0.2-SNAPSHOT: : \n&#91;INFO] &#91;prepare] 8\/17 rewrite-poms-for-release\n&#91;INFO] Transforming 'release-demo'...\n&#91;INFO] &#91;prepare] 9\/17 generate-release-poms\n&#91;INFO] Not generating release POMs\n&#91;INFO] &#91;prepare] 10\/17 run-preparation-goals\n&#91;INFO] Executing goals 'clean verify'...\n&#91;WARNING] Maven will be executed in interactive mode, but no input stream has been configured for this MavenInvoker instance.<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;INFO] &#91;prepare] 17\/17 end-release\n&#91;INFO] Release preparation complete.\n&#91;INFO] ------------------------------------------------------------------------\n&#91;INFO] BUILD SUCCESS\n&#91;INFO] ------------------------------------------------------------------------\n&#91;INFO] Total time:  23.413 s\n&#91;INFO] Finished at: 2021-09-23T20:58:13+05:30\n&#91;INFO] ------------------------------------------------------------------------<\/code><\/pre>\n\n\n\n<p>It generates a <code>release.properties<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#release configuration\n#Thu Sep 23 20:58:13 IST 2021\nprojectVersionPolicyId=default\nscm.branchCommitComment=@{prefix} prepare branch @{releaseLabel}\npinExternals=false\nproject.scm.me.samarthya\\:release-demo.connection=scm\\:git\\:${project.scm.url}\nproject.scm.me.samarthya\\:release-demo.tag=v1.0.0\nproject.rel.me.samarthya\\:release-demo=1.0.1\nexec.activateProfiles=profile-mine\npushChanges=true\nproject.scm.me.samarthya\\:release-demo.developerConnection=scm\\:git\\:${project.scm.url}\nproject.dev.me.samarthya\\:release-demo=1.0.2-SNAPSHOT\nscm.rollbackCommitComment=@{prefix} rollback the release of @{releaseLabel}\nremoteTagging=true\nscm.commentPrefix=&#91;scm bot]\nreleaseStrategyId=default\ncompletedPhase=end-release\nscm.url=scm\\:git\\:https\\:\/\/github.com\/samarthya\/release-demo.git\nscm.id=github.com\nscm.developmentCommitComment=@{prefix} prepare for next development iteration\nscm.tagNameFormat=@{project.version}\nproject.scm.me.samarthya\\:release-demo.url=https\\:\/\/github.com\/samarthya\/release-demo.git\nscm.tag=v1.0.1\nexec.snapshotReleasePluginAllowed=false\npreparationGoals=clean verify\nscm.releaseCommitComment=@{prefix} prepare release @{releaseLabel}\nexec.pomFileName=pom.xml<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2<\/h2>\n\n\n\n<p>Time to <code>perform<\/code> release<\/p>\n\n\n\n<p><code>mvn release:perform<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;INFO] Uploaded to virtual-repo-release: http:\/\/reposerver.samarthya.me:8082\/artifactory\/maven-local-release\/me\/samarthya\/release-demo\/1.0.1\/release-demo-1.0.1-sources.jar (4.2 kB at 4.8 kB\/s)\n&#91;INFO] Uploading to virtual-repo-release: http:\/\/reposerver.samarthya.me:8082\/artifactory\/maven-local-release\/me\/samarthya\/release-demo\/1.0.1\/release-demo-1.0.1-javadoc.jar\n&#91;INFO] Progress (1): 4.1\/125 kB\n&#91;INFO] Progress (1): 8.2\/125 kB\n&#91;INFO] Progress (1): 12\/125 kB \n&#91;INFO] Progress (1): 16\/125 kB\n&#91;INFO] Progress (1): 20\/125 kB\n&#91;INFO] Progress (1): 25\/125 kB\n&#91;INFO] Progress (1): 29\/125 kB\n&#91;INFO] Progress (1): 33\/125 kB\n&#91;INFO] Progress (1): 37\/125 kB\n&#91;INFO] Progress (1): 41\/125 kB\n&#91;INFO] Progress (1): 45\/125 kB\n&#91;INFO] Progress (1): 49\/125 kB\n&#91;INFO] Progress (1): 53\/125 kB\n&#91;INFO] Progress (1): 57\/125 kB\n&#91;INFO] Progress (1): 61\/125 kB\n&#91;INFO] Progress (1): 66\/125 kB\n&#91;INFO] Progress (1): 70\/125 kB\n&#91;INFO] Progress (1): 74\/125 kB\n&#91;INFO] Progress (1): 78\/125 kB\n&#91;INFO] Progress (1): 82\/125 kB\n&#91;INFO] Progress (1): 86\/125 kB\n&#91;INFO] Progress (1): 90\/125 kB\n&#91;INFO] Progress (1): 94\/125 kB\n&#91;INFO] Progress (1): 98\/125 kB\n&#91;INFO] Progress (1): 102\/125 kB\n&#91;INFO] Progress (1): 106\/125 kB\n&#91;INFO] Progress (1): 111\/125 kB\n&#91;INFO] Progress (1): 115\/125 kB\n&#91;INFO] Progress (1): 119\/125 kB\n&#91;INFO] Progress (1): 123\/125 kB\n&#91;INFO] Progress (1): 125 kB    \n&#91;INFO]                     <\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;INFO] Uploaded to virtual-repo-release: http:\/\/reposerver.samarthya.me:8082\/artifactory\/maven-local-release\/me\/samarthya\/release-demo\/1.0.1\/release-demo-1.0.1-javadoc.jar (125 kB at 134 kB\/s)\n&#91;INFO] &#91;INFO] ------------------------------------------------------------------------\n&#91;INFO] &#91;INFO] BUILD SUCCESS\n&#91;INFO] &#91;INFO] ------------------------------------------------------------------------\n&#91;INFO] &#91;INFO] Total time:  19.830 s\n&#91;INFO] &#91;INFO] Finished at: 2021-09-23T21:07:09+05:30\n&#91;INFO] &#91;INFO] ------------------------------------------------------------------------\n&#91;INFO] phase cleanup\n&#91;INFO] Cleaning up after release...\n&#91;INFO] ------------------------------------------------------------------------\n&#91;INFO] BUILD SUCCESS\n&#91;INFO] ------------------------------------------------------------------------\n&#91;INFO] Total time:  30.575 s\n&#91;INFO] Finished at: 2021-09-23T21:07:09+05:30\n&#91;INFO] ------------------------------------------------------------------------<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><img decoding=\"async\" width=\"1024\" height=\"388\" src=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/snapshot-versions-published-1024x388.png\" alt=\"\" class=\"wp-image-1749\" srcset=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/snapshot-versions-published-1024x388.png 1024w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/snapshot-versions-published-300x114.png 300w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/snapshot-versions-published-768x291.png 768w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/snapshot-versions-published.png 1424w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption>Repository view for the new <code>artifact<\/code> just published<\/figcaption><\/figure>\n\n\n\n<p>In the source repository also it has created a tag for the new build (an automated build)<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><img decoding=\"async\" width=\"1024\" height=\"124\" src=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/Screenshot-2021-09-23-at-9.10.26-PM-1024x124.png\" alt=\"\" class=\"wp-image-1750\" srcset=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/Screenshot-2021-09-23-at-9.10.26-PM-1024x124.png 1024w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/Screenshot-2021-09-23-at-9.10.26-PM-300x36.png 300w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/Screenshot-2021-09-23-at-9.10.26-PM-768x93.png 768w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/Screenshot-2021-09-23-at-9.10.26-PM-1536x186.png 1536w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/Screenshot-2021-09-23-at-9.10.26-PM-2048x248.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>We can manually now mark a new release in the GitRepo.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/Screenshot-2021-09-23-at-9.12.09-PM-1024x576.png\" alt=\"\" class=\"wp-image-1751\" srcset=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/Screenshot-2021-09-23-at-9.12.09-PM-1024x576.png 1024w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/Screenshot-2021-09-23-at-9.12.09-PM-300x169.png 300w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/Screenshot-2021-09-23-at-9.12.09-PM-768x432.png 768w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/Screenshot-2021-09-23-at-9.12.09-PM-1536x863.png 1536w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/Screenshot-2021-09-23-at-9.12.09-PM-2048x1151.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Finally!<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"723\" src=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/Screenshot-2021-09-23-at-9.13.16-PM-1024x723.png\" alt=\"\" class=\"wp-image-1752\" srcset=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/Screenshot-2021-09-23-at-9.13.16-PM-1024x723.png 1024w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/Screenshot-2021-09-23-at-9.13.16-PM-300x212.png 300w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/Screenshot-2021-09-23-at-9.13.16-PM-768x542.png 768w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/Screenshot-2021-09-23-at-9.13.16-PM-1536x1084.png 1536w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2021\/09\/Screenshot-2021-09-23-at-9.13.16-PM-2048x1446.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Everything starts form a single source file and as the time goes by, it gradually transforms into multiple modules, bulky source files and a source control repository. Mostly by this time the team has already adopted a a build tool, and a repository to publish the versioned artifacts. Journey is similar for every project successful [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":1739,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"image","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[34],"tags":[191,192,133],"class_list":["post-1736","post","type-post","status-publish","format-image","has-post-thumbnail","hentry","category-technical","tag-artifacts","tag-developer","tag-maven","post_format-post-format-image"],"_links":{"self":[{"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/posts\/1736","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/comments?post=1736"}],"version-history":[{"count":0,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/posts\/1736\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/media\/1739"}],"wp:attachment":[{"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/media?parent=1736"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/categories?post=1736"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/tags?post=1736"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}