Title:
Notice:    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.

# April 2015 Board report

Apache Aries delivers a set of pluggable Java components enabling an enterprise OSGi application programming model.

## Releases

Last report was February. The following releases have been created with promotion to maven central dates:

* Apache Aries Blueprint Core (blueprint-core) 1.4.3 2015/02/23
* Apache Aries Blueprint CM (blueprint-cm) 1.0.6 2015/02/23
* Apache Aries Blueprint Maven Plugin (blueprint-maven-plugin) 1.1.0 2015/03/03
* Apache Aries Blueprint no-OSGI (blueprint-noosgi) 1.1.0 2015/03/03
* Apache Aries Blueprint Web (blueprint-web) 1.1.0 2015/03/03
* Apache Aries JMX Core (jmx-core) 1.1.3 2015/03/09
* Apache Aries Transaction Enlisting JDBC Datasource (transaction-jdbc) 2.1.1 2015/03/09

* Apache Aries SPI Fly Core (internal module) (spi-fly-core) 1.0.2 2015/03/24?
* Apache Aries SPI Fly Dynamic Weaving Bundle (spi-fly-dynamic-bundle) 1.0.2 2015/03/24?
* Apache Aries SPI Fly Static Weaving Bundle (spi-fly-static-bundle) 1.0.2 2015/03/24?
* Apache Aries SPI Fly Static Weaving Tool (spi-fly-static-tool) 1.0.2 2015/03/24?

  Together the new SPI Fly releases pass the OSGi Enterprise R5 Service Loader Mediator 1.0 CT tests

* Apache Aries Subsystem API (subsystem-api) 1.1.0 2015/03/24
* Apache Aries Subsystem Core (subsystem-core) 1.2.0 2015/03/24
* Apache Aries Subsystem OBR (subsystem-obr) 1.0.1 2015/03/24
* Apache Aries Subsystems Bundle (subsystem-bundle) 1.2.0 2015/03/24

  Along with enhanced documentation.

## Project update

User questions across many of the Aries modules continue on the users@ list. Discussions about the refactoring of JPA and Quiesce modules on the dev@ list.
A new contribution from a non-committer: esa-ant-plugin for building Enterprise Subsystem Archives (ESAs), made it into trunk.

The SPI Fly releases were successfully voted, but the voting thread wasn't closed off in the usual way with a results tally. It looks like it was closed on 2015/03/24 as stated above.

There are no issues requiring board attention at this time.