You’ve just got to love the Maven Enforcer plugin. Anything with a byline of “The Loving Iron Fist of Maven” has got to endear you, no?

The Enforcer is a collection of configurable rules that will force your build to stop if certain preconditions are not met. One of the common ways I’ve been using it lately is to ensure that a certain JDK (1.4 in my case - don’t get me started on Websphere) is used when producing production artifacts.

I know what you’re thinking, just use the <target> config attribute to the compiler plugin? That would be true if the -target switches to the JDK compiler actually did what you think. But alas that is not the case unless you do funkiness with paths to the 1.4 runtime with a -bootclasspath option which sounds just too fragile and machine-specific. I’d prefer to just bomb out early if it’s not a real 1.4 JDK. I’m really dislike that java.lang.NoSuchMethodError stuff.

Anyways, here’s the build kungfu to ensure you enforce your preferred JDK:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>1.0-beta-1</version>
    <executions>
        <execution>
            <id>enforce-versions</id>
            <phase>validate</phase>
            <goals>
                <goal>enforce</goal>
            </goals>
            <configuration>
                <rules>
                    <requireJavaVersion>
                        <version>[1.4,1.5)</version>
                    </requireJavaVersion>
                </rules>
            </configuration>
        </execution>
    </executions>
</plugin>

Putting the goal against the validate phase makes everything die early. However, you might want to bind to “install” or whatever if you’re happy to develop against a later JDK. Giving this bad boy a run on Snow Leopard will give you output like:

[INFO] [enforcer:enforce {execution: enforce-versions}]
[WARNING] Rule 0: org.apache.maven.plugins.enforcer.RequireJavaVersion
failed with message:
Detected JDK Version: 1.6.0-15 is not in the allowed range [1.4,1.5).
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Some Enforcer rules have failed. Look above for specific messages
explaining why the rule failed.

Giddy up. Die early, die often.

I’m definitely making room for the Enforcer plugin in my Maven Quickstart Course running in Canberra next month. It’s gonna be a blast - and there’s still early bird pricing for the next week so if you’re interested in getting there, don’t forget to register early!

Enjoy the loving iron fist!