/*
 * 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.

The PDF manual is the right place to find any information about Karaf.

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

