#
#   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
currentVersion = 2.2.1

# 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,api2-legacy/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-legacy/project.xml
tck2.projects=api2/project.xml,api2-legacy/project.xml,util20/project.xml,model20/project.xml,enhancer20/project.xml,tck2/project.xml,tck2-legacy/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
