-- Copyright 2006 The Apache Software Foundation.
-- 
-- Licensed 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.

 ------
 openjpa
 ------

Welcome to the OpenJPA project site!

 OpenJPA is a set of Java persistence Application Program Interfaces (APIs) that are based on the Enterprise Java Beans 3.0 persistenace specification. This is the distribution and project management site for OpenJPA. For community resources, please see the {{{http://wiki.apache.org/incubator/OpenJPA}OpenJPA wiki}}.

 To download OpenJPA, please go to the {{{downloads.html}downloads}} page.


