/*
 * 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 EIK
===========================
Apache Karaf EIK (Eclipse Integration for Karaf) is the integration of the Apache Karaf
application platform and the Eclipse IDE.

Notable features include:
    * Custom Eclipse perspective for Apache Karaf development
        - Places valuable Karaf runtime information in one location
    * Apache Karaf installation management in your workspace
        - Karaf installations are managed as workspace projects giving the
          developer visibility in to the runtime.
        - Each Karaf installation is automatically synchronized with your
          workspace, include: additional bundles, configuration files
    * Run and Debug Karaf installations with a single Eclipse Launcher
        - The launch configuration allows developers to fine tune how Karaf
          will launch
    * Automatic deployment of workspace plugin projects
        - Create plugin-projects and have them deployed automatically.
    * Advanced instrumentation of the running Karaf instance
        - Watch bundles deploy in real time and examine the OSGi service
          registry from within the Eclipse IDE
    * Access Eclipse platform IDE plugins from within a running Karaf instance
        - All Eclipse plugins are presented as an OBR.

Getting Started
===============
For an Apache Karaf EIK source distribution, please read
BUILDING for instructions on building Apache Karaf EIK.

The PDF manual is the right place to find any information about Karaf EIK.

Alternatively, you can also find out how to get started here:
    http://karaf.apache.org/subprojects/eik

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/index/community/contributing.html


Many thanks for using Apache Karaf EIK.

The Karaf Team
