= Apache TomEE 1.7.1 Released!

After the huge buzz getting version 1.7.0 off the press it is time to get back to the day to day.
As promised we are committed to providing the best for our community, and so without further a do here is TomEE 1.7.1 - This is a maintenance release that fixes some minor issues and a few tweaks (We understand it is not so minor if you are waiting for it, so thanks for your patience).
This version is still shipped upon Apache Tomcat 7.0.55.

Please note that the TomEE 1.7.1 drop in WAR file will not work on Apache Tomcat 8.
If you are interested in a Tomcat 8.x version then please feel free to check out and xref:contribute.adoc[contribute to the developer branch] - We are always interested in any help from the community that we can get.

The Apache TomEE 1.7.1 release files can be downloaded from here:

xref:download-ng.adoc[http://tomee.apache.org/downloads.html]

*** Important Notes:

Issue https://issues.apache.org/jira/browse/TOMEE-1339[TOMEE-1339] introduced a default (but configurable) check for a static _index.html_ file when an empty JAX-RS resource URL is specified by a client.
You can use this file to return a descriptive response to the client for example.
Make sure that this optional file does not contain sensitive information when made available.
Currently it is not a JSP and it is not parsed in any way by the Servlet container - This may change in the next version.

A new property *openejb.finder.module-scoped* was added that changed default behaviour.
It is used to enable rare optional scanning outside of the current runtime scope.
For example, if a bean is declared in one application that is extended in another application or test scope then you must now explicitly enable cross scope scanning by setting *openejb.finder.module-scoped=true*

* In such cases failure to do this will invariably result in an *javax.naming.NameAlreadyBoundException*

*** Update Maven POM Files

Simply update your existing Maven JavaEE-API, OpenEJB and or TomEE pom.xml entries to point to the latest versions:

....
<dependency>
	<groupId>org.apache.openejb</groupId>
	<artifactId>javaee-api</artifactId>
	<version>6.0-6</version>
	<scope>provided</scope>
</dependency>

<dependency>
	<groupId>org.apache.openejb</groupId>
	<artifactId>openejb-core</artifactId>
	<version>4.7.1</version>
</dependency>

<dependency>
	<groupId>org.apache.openejb</groupId>
	<artifactId>tomee</artifactId>
	<version>1.7.1</version>
</dependency>
....

A complete xref:tomee-1.7.1-release-notes.adoc[Changelog] can be viewed here:

xref:tomee-1.7.1-release-notes.adoc[tomee-1.7.1-release-notes.html]

Please feel free to jump in feet first and 
//FIXME CHOOSE ONE
xref:0.0@tomee::documentation.adoc[]
xref:7.0@tomee::documentation.adoc[]
xref:7.1@tomee::documentation.adoc[]
xref:8.0@tomee::documentation.adoc[get started with TomEE].
You will nearly always find someone to help you on one of our xref:support.adoc[support channels].

*** Java EE7 and Beyond

From this point on the TomEE community will be focusing most of it's efforts on TomEE 2.0.x, which will be the first TomEE Java EE 7 driven version running on Apache Tomcat 8.x.
It is more than likely that support for Java SE 6 will be dropped so that Java SE 7 features can finally be leveraged during the development process.
We will of course continue to maintain the 1.7.x branch for the foreseeable future.
