If we take a look at the various plugin configurations, we can see the
HSQLDB dependencies duplicated in several places. Unfortunately,
dependencyManagement doesn’t apply to plugin dependencies, but we can
still use a property to consolidate the versions. Most complex Maven
multimodule projects tend to define all versions in the top-level
POM. This top-level POM then becomes a focal point for changes that
affect the entire project. Think of version numbers as string literals
in a Java class; if you are constantly repeating a literal, you’ll
likely want to make it a variable so that when it needs to be changed,
you have to change it in only one place. Rolling up the version of
HSQLDB into a property in the top-level POM yields the following
properties element:
<project>
...
<properties>
<hibernate.annotations.version>3.3.0.ga</hibernate.annotations.version>
<hsqldb.version>1.8.0.7</hsqldb.version>
</properties>
...
</project>
The next thing we notice is that the hibernate3-maven-plugin
configuration is duplicated in the simple-webapp and
simple-command modules. We can manage the plugin configuration in
the top-level POM just as we managed the dependencies in the top-level
POM with the dependencyManagement section. To do this, we use the
pluginManagement element in the top-level POM’s build element:
<project>
...
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>hibernate3-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<components>
<component>
<name>hbm2ddl</name>
<implementation>annotationconfiguration</implementation>
</component>
</components>
</configuration>
<dependencies>
<dependency>
<groupId>hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>${hsqldb.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</pluginManagement>
</build>
...
</project>