---
active_crumb: Docs
layout: documentation
id: installation
---

<!--
 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.
-->

<div id="installation" class="col-md-8 second-column">
    <section id="install">
        <h2 class="section-title">Installation</h2>
        <p>
            Apache NLPCraft requires <b>no special installation</b> operations:
        </p>
        <ul>
            <li>If you <a href="/download.html">downloaded</a> binary ZIP archive - <a target="asf" href="https://www.apache.org/dyn/closer.cgi#verify">verify</a> it and unzip it</li>
            <li>If you <a href="/download.html">cloned</a> GitHub repository or downloaded source archive - use <code>mvn clean install</code> to build it</li>
            <li>If you <a href="/download.html">used</a> Maven/Gradle/SBT - you know what you are doing 👍</li>
        </ul>
    </section>
    <section id="clean">
        <h2 class="section-title">Clean</h2>
        <p>
            For releases marked with <i class="fas fa-fw fa-bomb"></i> you need to clean our existing database. If you are
            using the Apache Ignite storage (default configuration for NLPCraft) you can accomplish this by
            removing <code>${USER_HOME}/.nlpcraft/ignite</code> folder.
        </p>
        <p>
            If you are using other storage engines (e.g. Postgres or MySQL) you need to follow their specific
            procedures to recreate the database using SQL scripts from <code>sql</code> sub-folder in NLPCraft
            installation directory.
        </p>
    </section>
    <section id="config">
        <h2 class="section-title">External Configuration</h2>
        <p>
            Due to <a target="asf" href="http://apache.org/legal/release-policy.html">Apache release policy</a> the official Apache release cannot include content that is based on
            <a target=_ href="https://creativecommons.org/licenses/by/4.0/">Commons Attribution 4.0 International</a> (CC BY 4.0) license
            or any binary artifacts regardless of their respective licences. Due to these restrictions the NLPCraft release
            does not include certain configuration files that are necessary for its operation. These files will be auto-downloaded upon first star of NLPCraft.
            On subsequent starts the NLPCraft will check for the updates and will re-download these files only if they were changed.
        </p>
        <p>
            By default, this external configuration is hosted on GitHub (in <code>master</code> branch of NLPCraft project) from where it will
            be automatically downloaded on the first start: <a target="github" href="https://github.com/apache/incubator-nlpcraft/tree/master/external">https://github.com/apache/incubator-nlpcraft/tree/master/external</a>.
            You can change this location, e.g. move the external configuration behind your firewall or onto your local file system,
            as well as change other parameters related to auto-download of the external configuration
            in <code>nlpcraft.conf</code> file (see <code>nlpcraft.extConfig</code> property).
        </p>
    </section>
    <section id="ignite">
        <h2 class="section-title">Apache Ignite 2.x <span class="amp">&amp;</span> Java 11+</h2>
        <p>
            Starting with NLPCraft 0.7.0, NLPCraft requires JDK 11 as its minimum JDK version.
            NLPCraft uses <a target=_ href="https://ignite.apache.org/">Apache Ignite 2.x</a> project as its
            underlying in-memory distributed storage and cluster computing framework. When running Apache Ignite 2.x
            on Java 11 you need to follow these
            <a target=_ href="https://apacheignite.readme.io/docs/getting-started#section-running-ignite-with-java-9-10-11">instructions.</a>
        </p>
        <div class="bq info">
            <p>
                <b>NOTE:</b> It is NOT recommended to change the version of Apache Ignite inside NLPCraft project.
            </p>
        </div>
    </section>
</div>
<div class="col-md-2 third-column">
    <ul class="side-nav">
        <li class="side-nav-title">On This Page</li>
        <li><a href="#install">Installation</a></li>
        <li><a href="#clean">Clean</a></li>
        <li><a href="#config">External Config</a></li>
        <li><a href="#ignite">Apache Ignite</a></li>
        {% include quick-links.html %}
    </ul>
</div>



