/*
 * 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.
 */

                      Apache ServiceMix 7.0.0.M1
                  ================================
 Overview
 --------

  !! This is a technology preview release of Apache ServiceMix, and should NOT be considered production ready !!

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.

Apache ServiceMix 7.0.0 will be the first release based on Karaf 4.0.x, which includes numerous new features. 
We ask that users provide the community with their feed back so that the full Apache ServiceMix 7.0.0 release 
can be as feature complete and stable as possible.

Apache ServiceMix 7.0.0.M1 is a new preview release of the project, which includes:

- Apache ActiveMQ 5.13.0 (http://activemq.apache.org)
- Apache Camel 2.16.2 (http://camel.apache.org)
- Apache CXF 3.1.4 (http://cxf.apache.org)
- Apache Karaf 4.0.4 (http://karaf.apache.org)


 Changelog
 ---------

** Bug
    * [SM-2251] - Intermittent test failure in JMSAppenderTest
    * [SM-2698] - ActiveMQ web console fails on J8
    * [SM-2786] - Drools 5 examples fail due to missing Eclipse JDT
    * [SM-2787] - Test failures in CxfWsnExamplesTest
    * [SM-2813] - Drools6CamelServiceExamplesTest fails with error
    * [SM-2814] - Drools6ExamplesTest fails with error
    * [SM-2818] - ServiceMix installs randomly spring 3.1.4.RELEASE feature
    * [SM-2823] - ActivitiExamplesTest fails accidentally 
    * [SM-2824] - Missing dependencies in system folder
    * [SM-2825] - Installation of CXF WSN sample fails
    * [SM-2845] - Installation of the cxf-wsn feature fails accidentally
    * [SM-2848] - cxf-wsn-client client fails due to wrong slf4j version
    * [SM-2851] - Some itests fail accidentally with NPE
    * [SM-2854] - Doclint for Javadoc fails on JDK 8

** Task
    * [SM-2355] - Remove the workaround jaxrs-api feature
    * [SM-2759] - Upgrade to Apache ActiveMQ 5.13.0
    * [SM-2763] - Upgrade to Activiti 5.19.0.1
    * [SM-2768] - Upgrade to Apache Karaf 4
    * [SM-2778] - Upgrade to Apache ActiveMQ 5.12.2
    * [SM-2803] - Refactor the assembly creation
    * [SM-2806] - Ensure ServiceMix uses Apache Commons Collections 3.2.2
    * [SM-2807] - Upgrade to Apache POM 17
    * [SM-2808] - Avoid warnings about 'parent.relativePath' during the maven build
    * [SM-2819] - Upgrade to Pax Exam 4.8.0
    * [SM-2820] - Upgrade to Apache Karaf 4.0.4
    * [SM-2821] - Upgrade to Apache Camel 2.16.2
    * [SM-2822] - Upgrade Maven-bundle-plugin to version 3.0.1
    * [SM-2826] - Upgrade to ServiceMix Specs 2.6.0
    * [SM-2844] - Upgrade to Activiti 5.19.0.2
    * [SM-2846] - Upgrade maven-compiler-plugin to 3.3
    * [SM-2847] - Upgrade maven-eclipse-plugin to 2.10
    * [SM-2849] - Upgrade to Jackson 2.6.3
    * [SM-2853] - Release Apache ServiceMix 7.0.0.M1

See the README file for more general information about ServiceMix 6.

Thanks you for downloading ServiceMix.  Enjoy !

The ServiceMix Team
http://servicemix.apache.org/community/team.html

