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


# comment-out, because of naming problems with the distribution plugin
# project.version=5.1.1-SNAPSHOT
XMLBeansVersion=5.1.1-SNAPSHOT

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Less than 2G definitely slows things down. -XX:+HeapDumpOnOutOfMemoryError
org.gradle.jvmargs=-Xmx2G -Dfile.encoding=UTF-8

# Activating will be much faster, but break the build of 'poi-ooxml-lite'
# @todo: look into poi-ooxml-lite task generateModuleInfo and enforce running whatever is needed before
org.gradle.caching=true

# Modularise your project and enable parallel build
org.gradle.parallel=true

# Enable configure on demand.
org.gradle.configureondemand=true

