#
#   Copyright 2005 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.
#

# Make sure the compiled class still work with J2SE 1.3
maven.compile.source = 1.3
maven.compile.target = 1.3

# checkstyle settings
maven.checkstyle.properties = ${basedir}/../jdo_checks.xml

# changelog settings
maven.changelog.factory = org.apache.maven.svnlib.SvnChangeLogFactory

# Set the javadoc title 
maven.javadoc.windowtitle = ${pom.name} ${pom.currentVersion}

# project lists
#   please note, the project lists must no include blanks
jdo11.projects=api11/project.xml,btree/project.xml,ri11/project.xml,tck11/project.xml
jdo20.projects=api20/project.xml,core20/project.xml,enhancer20/project.xml,\
runtime20/project.xml,query20/project.xml,btree/project.xml,fostore20/project.xml,\
tck20/project.xml
tck20.projects=api20/project.xml,core20/project.xml,enhancer20/project.xml,tck20/project.xml
fostore20.projects=api20/project.xml,core20/project.xml,runtime20/project.xml,query20/project.xml,btree/project.xml,fostore20/project.xml,enhancer20/project.xml

# release properties
jdo.releases.dir = ${basedir.substring(0, basedir.lastIndexOf('jdo'))}jdo/releases
jdo.releases.dist.dir = ${jdo.releases.dir}/${pom.currentVersion}/dist
