<!--
 * 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 name="scatours-launcher-introducing-domain" default="run">
    <import file="../../antdefs.xml"/>

    <!-- The "run" target runs the DomainManagerLauncher class directly
       (as if it had been invoked from a command line) and passes in the
       domain configuration directory as a command-line argument.  This
       only works with Tuscany SCA Java version 1.6 and above. -->
    <target name="run">
        <java classname="org.apache.tuscany.sca.node.launcher.DomainManagerLauncher"
              dir="." fork="true" failonerror="true">
            <classpath>
                <fileset dir="${env.TUSCANY_HOME}/modules">
                    <include name="tuscany-node-launcher-*.jar"/>
                </fileset>
            </classpath>
            <arg value="../../domainconfig/introducing/target/classes"/>
        </java>
    </target>
</project>
