#  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

