//
// 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, ...
* `/demos`: contains some simple Karaf samples
* `/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 systeù 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.
====


