<!--
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you under the Apache License, Version 2.0 (the
 "License"); you may not use this file except in compliance
 with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing,
 software distributed under the License is distributed on an
 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
-->
<project default="all">
    <target name="clean">
        <exec executable="mvn" failonerror="true">
            <arg line="-f pom-new-plugin.xml clean" />
        </exec>
        <exec executable="mvn" failonerror="true">
            <arg line="-f pom-old-plugin.xml clean" />
        </exec>
    </target>
    <target name="install">
        <exec executable="mvn" failonerror="true">
            <arg line="-f pom-new-plugin.xml install" />
        </exec>
        <exec executable="mvn" failonerror="true">
            <arg line="-f pom-old-plugin.xml install" />
        </exec>
    </target>
    <target name="all">
        <exec executable="mvn" failonerror="true">
            <arg line="-f pom-new-plugin.xml clean install" />
        </exec>
        <exec executable="mvn" failonerror="true">
            <arg line="-f pom-old-plugin.xml clean install" />
        </exec>
    </target>
</project>
