//
// Licensed 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.
//

=== Directory structure

The directory layout of a Karaf installation is as follows:

* `/bin`: control scripts to start, stop, login, ...
* `/examples`: contains several examples to start with Apache Karaf
* `/etc`: configuration files
* `/data`: working directory
** `/data/cache`: OSGi framework bundle cache
** `/data/generated-bundles`: temporary folder used by the deployers
** `/data/log`: log files
* `/deploy`: hot deploy directory
* `/instances`: directory containing [instances|instances]
* `/lib`: contains libraries
** `/lib/boot`: contains the system libraries used at Karaf bootstrap
** `/lib/endorsed`: directory for endorsed libraries
** `/lib/ext`: directory for JRE extensions
* `/system`: OSGi bundles repository, laid out as a Maven 2 repository

[NOTE]
====
The `data` folder contains all the working and temporary files for Karaf.
If you want to restart from a clean state, you can wipe out this directory, which has the same effect as
using the clean option to the Karaf start.
====


