Run an ant task in maven build phase before war is packaged?

18,433

Solution 1

Since I did not get any answer on my comment I guess that you want to stay using maven-antrun-plugin.

From what I've learned and experienced, if two plugins are to be executed on the same phase, then they will be executed in the order they are declared in pom.xml.

For this to work you will have to add the maven-war-plugin in the <plugins/> list after the maven-antrun-plugin.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.6</version>
    <executions>
        <execution>
            <id>deploy-ui</id>
            <phase>package</phase>
            <inherited>false</inherited>
            <configuration>
                <target>
                    <property name="buildDir" value="${project.build.directory}/${project.build.finalName}" />
                    <ant antfile="build.xml" target="static-assets" />
                </target>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.3</version>
    <executions>
        <execution>
            <!-- First step is to disable the default-war build step. -->
            <id>default-war</id>
            <phase>none</phase>
        </execution>
        <execution>
            <!-- Second step is to create an exploded war. Done in prepare-package -->
            <id>war-exploded</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>exploded</goal>
            </goals>
        </execution>
        <execution>
            <!-- Last step is to make sure that the war is built in the package phase -->
            <id>custom-war</id>
            <phase>package</phase>
            <goals>
                <goal>war</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Added some more executions so that the default-war is first disabled, then the war is exploded and lastly the war is packaged.

Solution 2

As you observed this is a place where the lifecycle doesn't provide the granularity needed. I answered a similar question for someone earlier. It's not an exact answer to your question but the technique may apply.

Share:
18,433
Patrick Clancey
Author by

Patrick Clancey

Updated on June 20, 2022

Comments

  • Patrick Clancey
    Patrick Clancey about 2 years

    When deploying a webapp I need to update some variables in UI resources, unzip some assets and concat some files, currently this is achieved via an ant task. I'm trying to run this task in the maven build process using something like this...

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.6</version>
        <executions>
            <execution>
                <id>deploy-ui</id>
                <phase>prepare-package</phase>
                <inherited>false</inherited>
                <configuration>
                    <target>
                        <property name="buildDir" value="${project.build.directory}/${project.build.finalName}" />
                        <ant antfile="build.xml" target="static-assets" />
                    </target>
                </configuration>
                <goals>
                    <goal>run</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    

    The above fails because the files have not yet been copied into target directory. If I set the phase to "package" the ant task runs fine and all the files are created/amended, but it's no help as the .war has already been built before the ant target is run.

    Basically, I need to run my ant target near the end of the prepare-package phase.

    Having looked though the Lifecycle Reference I can't workout how to expose the more granular Goals to the antrun plugin.

    Any ideas?

  • omilke
    omilke about 11 years
    this was a very helpful answer for my problem. However, I had a little different setup: exploded(prepare-package) --> copy-resources(prepare-package) --> war(package). In order to not overwrite what the war:explode task generated, I had to point <warSourceDirectory> to an empty directory for war:war execution.