Convention over configuration is a simple concept. Systems,
libraries, and frameworks should assume reasonable defaults. Without
requiring unnecessary configuration, systems should "just work". Popular
frameworks such as Ruby on
Rails and EJB3 have started to adhere to these
principles in reaction to the configuration complexity of frameworks such
as the initial EJB 2.1 specifications. An illustration
of convention over configuration is something like EJB3
persistence: all you need to do to make a particular bean persistent is to
annotate that class with @Entity. The framework
assumes table and column names based on the name of the class and the
names of the properties. Hooks are provided for you to override these
default, assumed names if the need arises, but, in most cases, you will
find that using the framework-supplied defaults results in a faster
project execution.
Maven incorporates this concept by providing sensible default
behavior for projects. Without customization, source code is assumed to be
in ${basedir}/src/main/java and resources are
assumed to be in ${basedir}/src/main/resources.
Tests are assumed to be in ${basedir}/src/test, and
a project is assumed to produce a JAR file. Maven
assumes that you want the compile byte code to
${basedir}/target/classes and then create a
distributable JAR file in
${basedir}/target. While this might seem trivial,
consider the fact that most Ant-based builds have to define the locations
of these directories. Ant doesn't ship with any built-in idea of where
source code or resources might be in a project; you have to supply this
information. Maven's adoption of convention over configuration goes
farther than just simple directory locations, Maven's core plugins apply a
common set of conventions for compiling source code, packaging
distributions, generating web sites, and many other processes. Maven's
strength comes from the fact that it is "opinionated", it has a defined
life-cycle and a set of common plugins that know how to build and assemble
software. If you follow the conventions, Maven will require almost zero
effort - just put your source in the correct directory, and Maven will
take care of the rest.
One side-effect of using systems that follow "convention over configuration" is that end-users might feel that they are forced to use a particular methodology or approach. While it is certainly true that Maven has some core opinions that shouldn't be challenged, most of the defaults can be customized. For example, the location of a project's source code and resources can be customized, names of JAR files can be customized, and through the development of custom plugins, almost any behavior can be tailored to your specific environment's requirements. If you don't care to follow convention, Maven will allow you to customize defaults in order to adapt to your specific requirements.
