#
#   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://maven1.glassfishwiki.org,\
https://maven-repository.dev.java.net/nonav/repository

# 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
