<!--
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.
-->
<assembly>
    <id>bin</id>
    <formats>
        <format>tar.gz</format>
        <format>zip</format>
    </formats>
    <fileSets>
        <fileSet>
            <includes>
                <include>LICENSE.txt</include>
                <include>NOTICE.txt</include>
                <include>RELEASE-NOTES.txt</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>target</directory>
            <outputDirectory></outputDirectory>
            <includes>
                <include>${artifactId}-${version}.jar</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>target/site/apidocs</directory>
            <outputDirectory>apidocs</outputDirectory>
            <includes>
                <include>**/*</include>
            </includes>
        </fileSet>
        <!-- Include sources jar for IDEs -->
        <fileSet>
            <directory>target</directory>
            <outputDirectory></outputDirectory>
            <includes>
                <include>${artifactId}-${version}-sources.jar</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>
