/*
 * 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 ServiceMix 4 
==============================
Apache ServiceMix is a flexible, open-source integration container that unifies 
the features and functionality of Apache ActiveMQ, Camel, CXF, and Karaf 
into a powerful runtime platform you can use to build your own integrations solutions. 
It provides a complete, enterprise ready ESB exclusively powered by OSGi.

It is being released under Apache License.

The main features are:
- reliable messaging with Apache ActiveMQ
- messaging, routing and Enterprise Integration Patterns with Apache Camel
- WS-* and RESTful web services with Apache CXF
- OSGi-based server runtime powered by Apache Karaf

Other, optional features:
- loosely coupled integration between all the other components with 
    Apache ServiceMix NMR including rich Event, Messaging and Audit API
- JBI (JSR-208) container implementation and a set of JBI components


Getting Started
===============
For an Apache ServiceMix 4 source distribution, please read 
BUILDING for instructions on building Apache ServiceMix 4.

For an Apache ServiceMix 4 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://servicemix.apache.org/smx4/

If you need more help try talking to us on our mailing lists
    http://servicemix.apache.org/mailing-lists.html

If you find any issues with ServiceMix 4, please submit reports 
with JIRA here:
    http://issues.apache.org/activemq/browse/SMX4

We welcome contributions, and encourage you to get involved in the 
ServiceMix community. If you'd like to learn more about how you can 
contribute, please see:
    http://servicemix.apache.org/contributing.html

Many thanks for using Apache ServiceMix.


The ServiceMix Team
http://servicemix.apache.org/team.html
