/*
 * 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.
 */

Welcome to Apache Felix Karaf
====================================
Apache Felix Karaf is a small OSGi based kernel which provides a
lightweight container onto which various bundles can be deployed.

The following features are included:
    * Hot deployment: Karaf supports hot deployment of OSGi bundles by monitoring
      jar files inside the [home]/deploy directory. Each time a jar is copied in this folder,
      it will be installed inside the runtime. You can then update or delete it and changes will
      be handled automatically. In addition, the Kernel also supports exploded bundles and custom
      deployers (a spring one is included by default).
    * Dynamic configuration: Services are usually configured through the ConfigurationAdmin OSGi
      service. Such configuration can be defined in Karaf using property files inside
      the [home]/etc directory. These configurations are monitored and changes on the properties
      files will be propagated to the services.
    * Logging System: using a centralized logging back end supported by Log4J, Karaf
      supports a number of different APIs (JDK 1.4, JCL, SLF4J, Avalon, Tomcat, OSGi)
    * Provisioning: Provisioning of libraries or applications can be done through a number of
      different ways, by which they will be downloaded locally, installed and started.
    * Native OS integration: Karaf can be integrated into your own Operating System as
      a service so that the lifecycle will be bound to your Operating System.
    * Extensible Shell console: Karaf features a nice text console where you can manage the
      services, install new applications or libraries and manage their state. This shell is easily
      extensible by deploying new commands dynamically along with new features or applications.
    * Remote access: use any SSH client to connect to the kernel and issue commands in the console
    * Security framework based on JAAS
    * Managing instances: Karaf provides simple commands for managing instances of Karaf.
      You can easily create, delete, start and stop instances of Karaf through the console.

Getting Started
===============
For an Apache Felix Karaf source distribution, please read
BUILDING for instructions on building Apache Felix Karaf.

For an Apache Felix Karaf binary distribution, please read
RELEASE-NOTES for installation instructions and list of supported 
and unsupported features.

Alternatively, you can also find out how to get started here:
    http://felix.apache.org/site/apache-felix-karaf.html

If you need more help try talking to us on our mailing lists
    http://felix.apache.org/site/mailinglists.html

If you find any issues with Apache Felix Karaf, please submit reports
with JIRA here:
    http://issues.apache.org/jira/browse/FELIX

We welcome contributions, and encourage you to get involved in the 
Felix community. If you'd like to learn more about how you can
contribute, please see:
    http://felix.apache.org/site/contributing.html

Many thanks for using Apache Felix Karaf.


The Felix Team

