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

maven.repo.remote=\
http://repo1.maven.org/maven,\
http://download.java.net/maven/1

# Current version number
jdo.currentVersion = 2.3-ea

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

# refer to LICENSE file in root directory
maven.license.licenseFile = ${basedir}/../LICENSE.txt

# checkstyle settings
maven.checkstyle.properties = ${basedir}/../jdo_checks.xml
maven.checkstyle.header.file = ${basedir}/../LICENSE.txt

# 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 not include blanks
jdo11.projects=api11/project.xml,btree/project.xml,ri11/project.xml,tck11/project.xml
jdo2.projects=api2/project.xml,util20/project.xml,model20/project.xml,enhancer20/project.xml,\
runtime20/project.xml,query20/project.xml,btree/project.xml,fostore20/project.xml,\
tck2/project.xml
tck2.projects=api2/project.xml,util20/project.xml,model20/project.xml,enhancer20/project.xml,tck2/project.xml
fostore20.projects=api2/project.xml,util20/project.xml,model20/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
