The original content is taken from the Maven Users Mailing list

Subject: Running Macker with Maven 2
Author: Rune Flobakk
Date and Time: Feb 14, 2007; 11:02am
Link: http://www.nabble.com/forum/ViewPost.jtp?post=8971367&framed=y&skin=177

Hi,

I've recently been trying out the Macker tool ( http://innig.net/macker ) to enforce architectural rules in a project of mine. I did some searching in this mailing list as well as Google if there was a way to run Macker with Maven 2, but only found questions from others asking how this should be done. The existing maven-macker-plugin is for Maven 1, though I have seen a message that there apparently is a Maven 2 plugin in development.

Anyway, I have been fiddling around a bit and found a way to run Macker in Maven 2 until a proper plugin is available, which I thought I'd share   here for anyone interested. As I still consider myself as a Maven 2 newbie, I would appreciate any feedback on this solution, if it seems reasonable at all. This is the first time I use the antrun plugin, and I have no experience using Ant before at all.

The description below is for a simple single project following the directory structure expected as default by Maven 2. It should however be simple to adapt it. This is going to be a bit lengthy, so bring a sandwich.

1. In your POM:

<build>
    ...
       <plugins>
          <plugin>
             <artifactId>maven-antrun-plugin</artifactId>
             <groupId>org.apache.maven.plugins</groupId>
             <version>1.1</version>
             <configuration>
                <tasks>
                   <ant antfile="${basedir}/build.xml"
                        inheritRefs="true">
                      <target name="macker"/>
                   </ant>
                </tasks>
             </configuration>
             <dependencies>
                <dependency>
                   <groupId>ant</groupId>
                   <artifactId>ant-antlr</artifactId>
                   <version>1.6.5</version>
                </dependency>
                <dependency>
                   <groupId>antlr</groupId>
                   <artifactId>antlrall</artifactId>
                   <version>2.7.4</version>
                </dependency>
                <dependency>
                   <artifactId>macker</artifactId>
                   <groupId>innig</groupId>
                   <version>0.4.2</version>
                </dependency>
                <dependency>
                   <artifactId>innig-util</artifactId>
                   <groupId>innig</groupId>
                   <version>0.4.2</version>
                </dependency>
                <dependency>
                   <artifactId>jakarta-regexp</artifactId>
                   <groupId>jakarta-regexp</groupId>
                   <version>1.4</version>
                </dependency>
                <dependency>
                   <artifactId>bcel</artifactId>
                   <groupId>bcel</groupId>
                   <version>5.1</version>
                </dependency>
                <dependency>
                   <artifactId>jdom</artifactId>
                   <groupId>jdom</groupId>
                   <version>1.0</version>
                </dependency>
                <dependency>
                   <artifactId>commons-lang</artifactId>
                   <groupId>commons-lang</groupId>
                   <version>1.0.1</version>
                </dependency>
             </dependencies>
          </plugin>
          ...
       </plugins>
    ...
</build> 

2. The build.xml file in ${basedir}. The location for this is configured in the POM plugin configuration above (antfile="${basedir}/build.xml").

<?xml version="1.0"?>

<project name="project-title" default="macker">
    <description>
       Ant task to run the Macker tool.
    </description>

    <target name="macker">
       <taskdef name="macker"
                classname="net.innig.macker.ant.MackerAntTask"
                classpathref="maven.plugin.classpath"/>
       <macker>
          <!--
             This classpath tells Macker where to look for its own
             libraries, and the libraries used by the primary classes.
          -->
          <classpath refid="maven.plugin.classpath" />


          <!--
              Rules come from this file:
          -->
         <rules dir="src/test/macker" includes="macker.xml" />


          <!--
              Macker will apply those rules to these primary classes:
          -->
          <classes dir="target/classes">
             <include name="**/*.class" />
          </classes>
       </macker>
    </target>
</project> 

3. The macker rules are placed in ${basedir}/src/test/macker/macker.xml. This location is specified in build.xml above at <rules dir="src/test/macker" includes="macker.xml" />

<?xml version="1.0"?>
<!DOCTYPE macker PUBLIC
           "-//innig//DTD Macker 0.4//EN"
           "http://innig.net/macker/dtd/macker-0.4.dtd">

<macker>
    <ruleset name="Architectural rules for StoryType">
        <!--
            Define some rules here.
            See http://innig.net/macker/guide/index.html
         -->
    </ruleset>
</macker> 

Using 'mvn antrun:run' will run Macker on your compiled classes in ${basedir}/target/classes/

I hope I haven't forgot anything, and that this may be of interest for others as well (smile)

Rune