# 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.

groovyVersion = 3.0.10
# bundle version format: major('.'minor('.'micro('.'qualifier)?)?)? (first 3 only digits)
groovyBundleVersion = 3.0.10

binaryCompatibilityBaseline = 3.0.5
gradle_version=6.9.2

groovyJUnit_ms=512m
groovyJUnit_mx=2g
groovyJUnit_permSize=64m
groovyJUnit_maxPermSize=256m

javacMain_mx=512m
groovycMain_mx=1g
groovycTest_mx=1g

javaDoc_mx=1g

# adjust if needed for different jdk versions
#org.gradle.jvmargs=-ea -Xmx1500m
org.gradle.jvmargs=-Xms800m -Xmx2g -XX:MaxMetaspaceSize=512m -XX:+UseG1GC

# enable the Gradle build cache
org.gradle.caching=true

# enable --parallel
org.gradle.parallel=true

# prefer jars over class folders on the compile classpath
org.gradle.java.compile-classpath-packaging=true

# enables watching the file-system
org.gradle.unsafe.watch-fs=true
