This is an AMP version of the article, its original content can be found here.
Don't Repeat Yourself in Maven POMs; Use Jcabi-Parent
Maven is a build automation tool mostly for Java projects. It's a great
tool, but it has one important drawback that has motivated the creation
of similar tools, like Gradle and SBT. That weakness is its verbosity of configuration.
Maven gets all project build parameters from
pom.xml, an XML
file that can get very long. I've seen POM files of 3,000-plus lines.
Taking into account 1) recent DSL buzz and 2) fear of XML, it's
only logical that many people don't like Maven because of its
But even if you're an XML fan who enjoys its strictness and elegance
(like myself), you won't like the necessity to repeat yourself in
for every project. If you're working on multiple projects, code duplication
will be enormous. An average Java web app uses a few dozen standard Maven plugins
and almost the same number of pretty common dependencies, like
JUnit, Apache Commons, Log4J, Mockito, etc. All of them have their versions
and configurations, which have to be specified if you want to keep
the project stable and avoid Maven warnings. Thus, once a new version
of a plugin is released, you have to go through all
pom.xml files in
the projects you're working on and update it there. You obviously understand
what code duplication means. It's a disaster. However, there is a solution.
jcabi-parent is a very simple Maven dependency
with nothing inside it except a large
pom.xml with multiple pre-configured
dependencies, profiles, and plugins. All you need to do in order to reuse them
all in your project is define
com.jcabi:parent as your parent POM:
That's all you need. Now you can remove most of your custom configurations
pom.xml and rely on defaults provided by jcabi-parent. Its
is rather large and properly configured. Multiple projects depend on it, so you
can be confident that you're using the best possible configuration of
all standard plugins.
Here are a few examples of
pom.xml from projects that are using
jcabi-parent (you can see how compact they are):