<!--
  ~ 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 xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd
http://maven.apache.org/ASSEMBLY/2.0.0 ">
    <!--Required, will be appended to the end of the packaged file name-->
    <id>incubating-bin-linux_arm64</id>
    <includeBaseDirectory>true</includeBaseDirectory>
    <baseDirectory>apache-hertzbeat-${hzb.version}-incubating</baseDirectory>
    <!--Packaging type, multiple types can be set, different types will be packaged when packaging-->
    <formats>
        <format>tar.gz</format>
    </formats>
    <!--Third-party dependency settings-->
    <dependencySets>
        <dependencySet>
            <!--Use artifacts in the project, third-party packages packaged into the lib directory of the tar.gz file-->
            <useProjectArtifact>true</useProjectArtifact>
            <outputDirectory>lib</outputDirectory>
        </dependencySet>
    </dependencySets>

    <!--File-related settings-->
    <fileSets>
        <!--All script files under the bin directory are output to the bin directory after packaging-->
        <fileSet>
            <directory>../script/assembly/server/bin</directory>
            <!-- Whether to perform property replacement, that is, use ${project.artifactId} -->
            <filtered>true</filtered>
            <outputDirectory>bin</outputDirectory>
            <fileMode>0755</fileMode>
        </fileSet>

        <!-- Configuration files under the src/main/resources directory are packaged to the config directory-->
        <fileSet>
            <directory>src/main/resources</directory>
            <includes>
                <include>application.yml</include>
                <include>logback-spring.xml</include>
                <include>sureness.yml</include>
            </includes>
            <!-- Whether to perform property replacement, that is, use ${project.artifactId} -->
            <filtered>true</filtered>
            <outputDirectory>${file.separator}config</outputDirectory>
        </fileSet>

        <!-- Configuration files under the src/main/resources/define directory are packaged to the define directory -->
        <fileSet>
            <directory>src/main/resources</directory>
            <includes>
                <include>define/**</include>
            </includes>
            <filtered>true</filtered>
            <outputDirectory>${file.separator}</outputDirectory>
        </fileSet>

        <!-- Pack the startup jar in the target directory to the directory-->
        <fileSet>
            <directory>target</directory>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>*.jar</include>
            </includes>
        </fileSet>

        <!-- Pack the static resources of the web app into the directory-->
        <fileSet>
            <directory>../web-app/dist</directory>
            <outputDirectory>dist</outputDirectory>
        </fileSet>

        <!-- copy jdk -->
        <fileSet>
            <directory>../jdk/linux-arm64</directory>
            <outputDirectory>java</outputDirectory>
        </fileSet>

        <!-- external lib -->
        <fileSet>
            <directory>../script/ext-lib</directory>
            <includes>
                <include>**/*</include>
            </includes>
            <outputDirectory>ext-lib</outputDirectory>
        </fileSet>

        <!-- license -->
        <fileSet>
            <directory>../</directory>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>DISCLAIMER</include>
                <include>README.md</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>../material/licenses</directory>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>LICENSE</include>
                <include>NOTICE</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>../material/licenses/backend</directory>
            <outputDirectory>licenses</outputDirectory>
            <includes>
                <include>LICENSE-*</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>../material/licenses/frontend</directory>
            <outputDirectory>licenses</outputDirectory>
            <includes>
                <include>LICENSE-*</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>
