Skip to main content

Maven (0) - Preface

During our java based microservice development, we extensively use build tools like Maven or Gradle. Usually, IDEs do a lot on our behalf or we just run some predefined commands without checking what's happening inside. Here in this series of 6 posts, I tried to explain Maven.

Before I start talking about what Maven is, and its different components, let’s discuss the “why”. Why do we even need Maven? 
For this, I’ve to first explain the nature of a Java-based project and also need to take you back in history.

The “Build” Step.

Java is a compilable language, Unlike Python or Javascript, which are interpreted. ie, the code we write in java, can not as-is run on a Java virtual machine (JVM). JVM understands only the bytecode.

Therefore, in the Java world, there is always a need for an intermediary step. A step that compiles the java code files into bytecode. That's why after writing the java code, we “somehow” create some deployable (jar, war, ear) to run on machines having JVMs.

This intermediary step of converting the java code to a deployable is called the build process, and this is what gave birth to various build tools for java.

In an enterprise application, the build process is more complex. Older monolith enterprise applications used to have many other components, ie, XML configs, UI code files, etc. So the intermediary step was not limited to code compilation, there were various other steps involved to create a final deployable, such as placing UI files in the right places, copying configuration files, etc.

Older ways

This is how we progressed as I remember.

  • In the early 2000s, I remember creating jar files for standalone applications by using jar -cf on my developer machine and deploying them on the required production machine.
  • Things got a little better when we started creating deployable using fancy IDE (eclipse) plugins, but still on the developer machines.
  • Then came an era of ANT. With Ant scripts, the whole build process could be defined in XML files using interdependent Targets, with predefined or custom tasks.

I migrated the complete build process for a few big enterprise applications with ant script and custom tasks. In retrospect, that was too much work compared to what we need to do now thanks to maven.

The unsolved problem

ANT streamlined the build processes to a big extent by removing manual steps during the build and providing the capability to create a final deployable with just one command or click.

However, an initial project setup was still an issue. Someone still had to figure out all the dependency jars needed by the codebase and manually place them at some predefined location for ANT to use during the build. 
And It was not just the direct dependencies that need to be placed, but also the transitive dependencies with supported versions.

In my experience, finding the correct version of supported dependencies was the real challenge, because of the broken backward compatibility of many transitive dependencies.

The ultimate solution

The folks in Apache solved this problem, by introducing a build tool named Apache-Maven. The word “Maven” means an expert. So this tool was an expert on all the things a build process needs.

Maven was introduced as a build tool for Java-based projects. Maven addressed a lot more than just the dependency management problem that I explained in the previous section. 
For example, code quality checks, running integration tests, deploying the artifact to the shared repository, etc. We will discuss them in the next 6 (or more) posts of this series. Here are the direct link (if the post is ready) for each post in the series.

  1. Maven (1)- The Life of a build (Goals & Phases)
  2. Maven (2)- I need you (Dependencies)
  3. Maven (3)- Conflicts resolution (the Maven way)
  4. Maven (4)- Changing the life (build Plugins)
  5. Maven (5)- Multi-Module project
  6. Maven (6)- BOM to manage POM

That's all for the preface of the series, go through the remaining posts in the series for more understanding.

Comments

Popular posts from this blog

An Introduction to Quartz Scheduler

It's a common use case to have an enterprise application, perform specific work, at a specific time or in response to a specific action. In other words, “There is an ask to execute a  Job  upon a predefined  Trigger ”. This brings us to the need for a  Scheduling System.  A system, where  Jobs  &  Trigger  can be registered and the system will manage the remaining complexity. Thankfully for the Java systems,  Quartz  is for rescue. It‘s an open-source library that has been extensively used in enterprise applications for more than a decade. Components in Quartz Sub System: Following are the all major component in the Quartz subsystem: Scheduler : It’s the control room of Quartz. It maintains everything required for scheduling,  such as managing listeners ,  scheduling jobs , clustering, transactions & job persistence. It maintains a registry of  JobDetails ,  Listeners  &  Triggers , and executes Job & Listeners when their associated Trigger is fired. SchedulerFactor

Unable to Redo in VS-Code & Intellij

Since the beginning of personal computers, few keyboard shortcuts are common among all operating systems and software. The ubiquitous cmd+c (copy), cmd+v(paste) , cmd+z (undo) and cmd+y (redo) I am not sure why, both of my favorite IDEs,  Visual Studio Code  &  Intellij  decided to not use  cmd+Y for redo.Below are the quick steps to configure  cmd+Y for a redo in VS-Code & Intellij Visual Studio Code Open VS Code & Go to keyboard shortcuts There will be a search bar at the top Type “  redo  “ in the search bar. You can see on my system its still mapped to  shift+cmd+z Double click on  ⇧ ⌘ z  and the below box will appear. Do not click anywhere or type anything on the keyboard except the key you want to assign, in our case it was  cmd+y,  so type  cmd+y Press Enter and you are done. Now you can use  cmd+z  for undo and  cmd+y  to redo like always Intellij It is also as simple as VS-Code Open IntelliJ & go to  Preferences In the search bar search for the  redo. In the ri

My Custom Built Desktop. The Questions & The Answers!

If  you want to avoid overpriced pre-builts like the M1 Mac Mini, Mac Pro, or Dell XPS Desktop without compromising on performance, a self-built desktop is a preferred option. It's also a great choice if you enjoy building things. custom built with ASUS-PRIME-P If you choose to build a custom PC, be prepared to invest time in researching and assembling compatible components.  In this post, I'll share my experience building this colorful powerhouse. I'll cover: Why did I do it.  Key questions to ask when selecting components Thought process behind component choices Components used in my build Benchmark comparisons . ** My second custom-build **.  ***  Disclaimer: Not an Apple product. Just a free apple sticker is used *** Why did I do it I decided to get a desktop during the pre-MacM1 era (yes, that’s a thing). After browsing many websites, I found that well-configured prebuilt PCs were overpriced, while cheaper ones had subpar components. Unable to choose between the option

Time Zones, Meridian, Longitude, IDL… It's more politics than science.

Once, I was working on a few geospatial APIs handling many time zones. While writing tests, I realized I did not know much about timezones. A lame excuse might be, my subpar schooling as a village kid. Nevertheless, I decided to turn the pages on timezones, what I found was more politics than science. Photo by  Arpit Rastogi  on  Unsplash Before diving into anomalies, let’s talk about history then we will go to science followed by politics. History The world without time zones By 300 BCE, the western world agreed that the earth is round. Each developed civilization devised its unique distinct system to measure distances, times & absolute locations, but relative to prime locations within their civilizations. It all worked in ancient times because long-distance travel was not prevalent among common people. Only merchants or armies traveled long distances. And they already developed systems that worked on their predetermined routes, irrespective of the time differences between locatio

BDD (1) — Behavior Driven Development

A wise man ( narcissist me ) once said, “Life is all about the question and answers. The trick to a meaningful life is,  To ask the right questions to yourself, so you can get on the right path to search for the answer .” The very first question one should always ask oneself is WHY.  Let's discuss our WHY in the current case. Why BDD Let's take a step back and start with the well-known software development practice TDD ( Test-Driven Development).  In TDD, the very first thing developers do is, set up the technical expectations from the code by writing failing test cases. After the expectation is set, the code is written/modified to finally pass all of the failing tests. It's an  Acceptance driven development strategy . TDD works fine to create a robust technically working product. But the whole TDD approach revolves only around technical teams. It barely involves the business analysis or product owners to validate the business aspect of a feature, they get involved only aft