<!--

    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.

-->
<html>
<body>

Ways of getting information about Ant-based projects useful from other projects.

<p>An {@link org.netbeans.api.project.ant.AntArtifact} is a representation of a
build product created from a (somehow Ant-based) project. Rather than relying on
details of how another project arranges its builds, a parent project can use
{@link org.netbeans.api.project.ant.AntArtifactQuery} to find Ant artifacts from
another project (or, perhaps, arbitrary source not formally contained in a
project). Using artifact information it is possible to tell what build product
(file or directory) will be created and what general sort it is (e.g. JAR vs.
Javadoc); which Ant script and target to run to create that build product; and
how to request that it be cleaned. This information suffices to create an Ant
build script in the parent project that can run sub-builds.</p>

</body>
</html>
