Thursday, January 26, 2017

What is difference between Maven, ANT, Jenkins and Hudson?

In short, though Maven and ANT are build tools the main difference is that maven also provides dependency management, standard project layout, and project management. On the difference between Maven, ANT, and Jenkins, later is a continuous integration tool which is much more than a build tool. You can set up your CI environment using Jenkins or Hudson and automatically build, test, and deploy your Java project. Now last, the main difference between Jenkins and Hudson, both originate from the same source code but one is a closed source while the other is open source. You can read the details in this article.


Now let's start a long story, what is the difference between Maven and ANT or difference between Maven and Jenkins, or Maven vs Hudson are some of the frequently discussed questions among Java when developers. Well all four e.g.  ANT, Maven, Jenkins, and Hudson are tools to help Java developers on the build, unit testing, continuous integration (CI), and project management.

In this Java article, we will explore each of Maven, ANT, Jenkins, and Hudson to get a basic idea of what they are, what benefit they offer, and how they are used in Java JEE projects. Just to give you a basic idea, ANT is a well-known build tool, probably the oldest among all. A build tool is used to create deliverables like JAR file or WAR file from Java source and resources for deployment.

Maven came after ANT and offers much more than a build tool. The main difference between ANT and Maven is that In ANT you need to define everything i.e. source directory, build directory, target directory, etc while Maven adopts the principle of Convention over configuration.

This means Maven has a predefined project structure i.e. standard directory for source files, test files, and resources. On the other hand, Jenkins and Hudson are the Continues Integration tool, which gives you the power to automate your build and deployment process.

By using Jenkins or Hudson you can trigger build whenever the developer commits code, to see if the project is compiling fine, to run unit tests, to create a build, or even deploy in QA or production environment.

Similarly, you can have a daily built, nightly build, or weekly build process established in Jenkins or Hudson. In the next section, we will understand Maven, ANT, Jenkins, and Hudson in more detail and understand the difference between them.

Btw, if you are just starting with Maven, I suggest you to first go through a comprehensive Maven course like Apache Maven: Beginner to Guru to learn some fundamentals. It will not only help you to build and deploy your Java and Spring Boot projects using Maven but also learn Maven itself in depth.




Maven vs ANT

Ever since Maven has released, many Java programmers compare Maven and ANT, which is pretty natural. Even I have taken some time to adopt Maven because I was very used to the ANT build process. Eventually, I realized Maven offers more convenience as a build tool than ANT and also enforces a common way to build Java applications among multiple projects, developers, and organizations.

Before shifting to Maven, I had worked with very complex ANT scripts, in-fact every project I work has a different build structure than others.

In order to make a release, you need to spend considerable time understanding the whole build process e.g. from where do libraries are coming, are they coming as JAR or project is building them during build time, etc. Maven solves many of these problems by introducing standard convention and better dependency management.

If we need to compare Maven and ANT, following are my list of difference between Maven and ANT :
Difference between Maven and ANT in Java


1) One major difference between Maven and ANT is that Maven requires less configuration than ANT because it works on the principle of convention over configuration and assumes reasonable default e.g. java source file in ${basedir}/src/main/java, resources on ${basedir}/src/main/resources, JUnit test cases on ${basedir}/src/test/java, etc.

It also creates Java class files on ${basedir}/target/classes and JAR file on ${basedir}/target directory. On the other hand, ANT requires all these directories supplied as configuration, usually in ANT build file e.g. build.xml.


2) Another significant difference between Maven and ANT is dependency Management. Maven introduced the concept of the repository, which is a central place to store all libraries, JARs, etc. Maven allows you to use a central maven repository as well as a local repository and automatically download dependency during the build process.

While ANT based projects generally use ${lib} as a directory to store dependencies. Changing and updating dependency is much easier in maven than ANT because you don't need to manually download dependency. Having an organization-wide central repository also helps to remove redundancy across different projects.


3) The third and most important difference between Maven and ANT is that Maven offers a consistent and common interface to build Java projects. All you need to do is download the project and run mvn install to build it. Also by knowing maven conventions and looking at pom.xml, one can easily understand where source files are and what are project dependencies.


4) Another technical difference between ANT and Maven is that ANT task doesn't have any lifecycle, you need to define targets and their dependencies. While Maven has a lifecycle, which is invoked when you run commands like mvn install. Maven executes a series of steps as a result of this command to produce artifacts e.g. JAR file, which is the end of the life cycle.


5) Maven also enforces a standard naming convention for artifacts defined using groupId, artifactId, and version. Also, one more difference between ANT and Maven is that Maven is more than just a build tool, it acts as a project management tool and can generate reports, etc, Though I have yet to use this feature.



Maven vs Jenkins and Hudson

Jenkins and Hudson are Continuous Integration tool, commonly known as CI frameworks. They allow Java project to automate build and deployment process. By using CI tools like Hudson or Jenkins you can create hourly or daily builds automatically, you can also automatically run your unit tests and can deploy build to your QA or production environment.

This helps if you are working in a large project and the development team is spread across multiple locations. CI tools can trigger build whenever the developer commits code and check if the project is compiling or not.

By the way, Jenkins and Hudson are from the same source tree. Hudson was an original project which was open source and supported by Sun.

When Oracle bought Sun, it took control over the Hudson name and logistic platform of Hudson. Many open source contributor was not comfortable with that which results in Jenkins, which is pretty much community-driven.

If we need to compare Maven and Jenkins or Hudson, the following would be my list of differences between Maven and Hudson or Jenkins :
Difference between Jenkins and Hudson in Java


1) The main difference between Maven and Jenkins or Hudson is that Maven is a build tool that knows how to build a project and Jenkins or Hudson provides a trigger to build. You can control when to trigger build automatically using Jenkins or Hudson or any CI tool.


2) Jenkins can use Maven as a build tool. Also, Jenkins or Hudson can do a lot more than just building applications, they can run all unit tests, deploy deliverables into configured servers, etc. Essentially the difference is that Maven is a build tool while Jenkins of Hudson is a Continues Integration tool.


That's all on the difference between Maven and ANT, Jenkins or Hudson, etc. Maven is pretty much standard of building Java projects nowadays and you can customize it to fit in your ANT based legacy environment. Some organization also has CI tools like Jenkins which can be used along with Maven to automated build, test, and deploy process.

Further Learning
Maven Fundamentals by Bryan Hansen
Maven Crash Course
Java Maven :101 Stop Building Java Programs the Hard Way!

10 comments :

Jan Andersen said...

Oldest of all? I think that honour goes to 'make'.

My Views said...

In my opinion, Gradle is more advanced than Maven as a build tool. It gives us the features of both Ant an d Maven. And moreover its lot easier to read than Maven.

Anonymous said...

So, for Jenkin/hudson to work it requires a build tool ?

Anonymous said...

Cant we use jenkins without maven or other build tool?

Unknown said...

Any Jenkin Tutorial?

Unknown said...

Gradle is much more flexible than maven. In fact if you are not willing to do it the maven way, maven is very rigid. But it ensures an understandable build process that willl work across teams and organizations. There is always an urge to say, we are special and tweek the build scripts instead of using a standard approach. Grade will allow that, maven less so.

Unknown said...

Hi, I Just want to know if there is today a better solution than maven, cause it is kind of tricky for beginers. I have heard about gradle and I would like to know if you know it and if it´s good enough to replace maven. Thank you

Anonymous said...

I also would like to see some updates to this article. Gradle is not mentioned at all. How you compare it Maven, Ant? Pros, cons, compared to other build tools.

Unknown said...

How about listing the things Ant builds give you that Maven doesn't? For instance, when you run your Ant build, you know what it's going to do. When you run a Maven build, assuming you have any dependencies, what it does is dependent on external factors, so your build may not work tomorrow.

Unknown said...

i have read your article and understood about the difference between Maven and Jenkins. your article is easy for begineers. share some tutorial also

Post a Comment