/*
 * 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 Karaf
=======================
Apache Karaf is a modern and polymorphic container.
It's a lightweight, powerful, and enterprise ready container powered by OSGi.
The container is able to host different kind of applications, OSGi or non OSGi.

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 Karaf source distribution, please read
BUILDING for instructions on building Apache Karaf.

For an Apache 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://karaf.apache.org/

If you need more help try talking to us on our mailing lists
    http://karaf.apache.org/site/mailinglists.html

If you find any issues with Apache Karaf, please submit reports
with JIRA here:
    http://issues.apache.org/jira/browse/KARAF

We welcome contributions, and encourage you to get involved in the 
Karaf community. If you'd like to learn more about how you can
contribute, please see:
    http://karaf.apache.org/community.html#contribute

Many thanks for using Apache Karaf.


The Karaf Team
