//////////////////////////////////////////

  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.

//////////////////////////////////////////

= Apache Groovy
The Groovy development team
:revdate: 18-11-2020
:build-icon: https://ci.groovy-lang.org/app/rest/builds/buildType:(id:Groovy30xTestAllJdk8)/statusIcon
:travis-build-icon: https://travis-ci.com/apache/groovy.svg?branch=GROOVY_3_0_X
:sonarcloud-icon: https://sonarcloud.io/api/project_badges/measure?project=apache_groovy&metric=sqale_rating
:noheader:
:groovy-www: https://groovy-lang.org/
:groovy-ci: https://ci.groovy-lang.org?guest=1
:travis-ci: https://travis-ci.com/apache/groovy
:sonarcloud: https://sonarcloud.io/dashboard?id=apache_groovy
:jdk: https://www.oracle.com/technetwork/java/javase/downloads
:bintray-latest-version-image: https://api.bintray.com/packages/groovy/maven/groovy/images/download.png
:bintray-latest-version-link: https://bintray.com/groovy/maven/groovy/_latestVersion
:bintray-watch-image: https://www.bintray.com/docs/images/bintray_badge_color.png
:bintray-watch-link: https://bintray.com/groovy/maven/groovy/view?source=watch
:apache-license-icon: https://img.shields.io/badge/license-APL2-blue.svg
:apache-license-link: http://www.apache.org/licenses/LICENSE-2.0.txt
:apache-groovy-twitter-icon: https://img.shields.io/twitter/follow/ApacheGroovy.svg?style=social
:apache-groovy-twitter-link: https://twitter.com/intent/follow?screen_name=ApacheGroovy
:jdk-icon: https://img.shields.io/badge/java-8+-4c7e9f.svg
:bintray-download-icon: https://api.bintray.com/packages/groovy/maven/groovy/images/download.svg
:opencollective-link: https://opencollective.com/friends-of-groovy
:sponsors-silver-img: https://opencollective.com/friends-of-groovy/tiers/silver-sponsor.svg?avatarHeight=45&width=890
:sponsors-bronze-img: https://opencollective.com/friends-of-groovy/tiers/bronze-sponsor.svg?avatarHeight=40&width=890
:backers-monthly-img: https://opencollective.com/friends-of-groovy/tiers/backer.svg?avatarHeight=36&width=890
:backers-all-img: https://opencollective.com/friends-of-groovy/backers.svg?avatarHeight=32&width=890

[.left.text-left]
image::https://raw.githubusercontent.com/groovy/artwork/master/medium.png[]
image:{jdk-icon}[jdk, link={jdk}]
image:{apache-license-icon}[Apache License 2, link={apache-license-link}]
// image:{build-icon}[teamcity build status, link={groovy-ci}]
image:{travis-build-icon}[travis build status, link={travis-ci}]
image:{sonarcloud-icon}[maintainability rating, link={sonarcloud}]
image:{bintray-download-icon}[bintray download, link={bintray-latest-version-link}]
image:{apache-groovy-twitter-icon}[follow on Twitter, link={apache-groovy-twitter-link}]

{groovy-www}[Groovy] is a powerful multi-faceted programming language for the JVM platform.
It supports a spectrum of programming styles incorporating features from dynamic languages such as optional and duck typing, but also
static compilation and static type checking at levels similar to or greater than Java through its extensible static type checker.
It aims to greatly increase developer productivity with many powerful features but also a concise, familiar and easy to learn syntax.

It integrates smoothly with any Java class or library, and immediately delivers to your application powerful capabilities,
including scripting support, Domain-Specific Language authoring, runtime and compile-time meta-programming and functional programming. 

== Downloading

Latest Groovy version is available on Bintray image:{bintray-latest-version-image}[Bintray latest version, link={bintray-latest-version-link}]

Binary distribution links are on the package page.

Maven, Gradle and Ivy dependency declaration snippets are available on specific files of a particular module.

image:{bintray-watch-image}[Get automatic notifications about new "groovy" versions link={bintray-watch-link}]

== Obtaining the Source

You don't need the source code to use Apache Groovy but if you wish to explore its inner workings or build it for yourself there are two ways to obtain the source files.

=== Checking out from Version Control

Apache Groovy uses Git. The official Git repository is at:

    https://gitbox.apache.org/repos/asf/groovy.git

And a mirror is hosted on Github:

    https://github.com/apache/groovy

The Github mirror is read-only and provides convenience to users and developers to explore the code and for the community to accept contributions via Github pull requests.

Simply `git clone` the repo (or the repo you forked via the github website) and you will have the complete source.

=== Unpacking the src distribution

Alternatively, you can download the source distribution and unpack it.

If obtaining the source from the source distribution and you intend to build from source,
you also need to https://gradle.org/downloads/[download] and install http://gradle.org/[Gradle] and
use it to execute one bootstrap step.

==== Bootstrapping Gradle

As mentioned in the previous paragraph, if you download the source distribution
you need to bootstrap Gradle. This isn't needed if you clone from the Github repo.

Each version of Groovy is built and tested using a specific version of Gradle.
That version is specified by the `gradle_version` property defined in the `gradle.properties`
file within the root directory. Luckily you shouldn't need to know that version and,
after bootstrapping, you should use the `gradlew` command which will ensure the
correct version is always used.

The version of Gradle used for the bootstrap step has some flexibility though in general
you might need to download a version similar to the version of Groovy the build is
expecting.

To bootstrap Gradle, at the top directory of your unpacked source, run the command:

    gradle -b wrapper.gradle wrapper

On Unix-like systems, use `./gradle`.
If the version of Gradle you have installed is close to the required version,
you might be able to get away without the `-b wrapper.gradle` above, but if in
doubt leave it in.

*NOTE*: At this point, the Gradle wrapper should be set up and from now on you should use
the `gradlew` command instead of `gradle`. (On Unix-like systems, use `./gradlew`).

== Building from Source

// Build is image:{build-icon}[build status, link={groovy-ci}].

To build you will need:

* {jdk}[JDK 9+]

To build everything using Gradle, use the following command (`./gradlew` on Unix-like systems):

    gradlew clean dist

Note: The gradlew command automatically downloads the correct Gradle version if needed, you do not need to download it first.

This will generate a distribution similar to the zip you can download on the Groovy download page.

To build everything and launch unit tests, use:

    gradlew test

If you want to launch one unit test, use this. <TestClassName> is like `groovy.GroovyMethodsTest`.

    gradlew :test --tests <TestClassName>

To build from IntelliJ IDEA:

    gradlew jar idea

Then open the generated project in IDEA.

To build from Eclipse:

    gradlew jar eclipse

Then open the generated project and the generated subprojects in Eclipse. But be aware that Eclipse tends to be more limited in its ability to reproduce a Gradle build structure. The generated project files may contain a circular dependency which may or may not prevent Eclipse from using them. It depends on the Eclipse version, if this is an issue or not.

To build the documentation (Groovy Language Documentation):

    gradlew asciidoc

All code samples of the documentation guide are pulled from actual test cases. To run a single documentation test case, take for example `src/spec/test/semantics/PowerAssertTest.groovy`

    gradlew testSinglePowerAssertTest

(Note the omission of package name: class is `semantics.PowerAssertTest` but only `PowerAssertTest` is added to `testSingle`.)

== InvokeDynamic support

The Groovy build supports the JVM instruction `invokedynamic`. If you want to build Groovy with invokedynamic, you can use the project property `indy`:

    gradlew -Pindy=true clean test

Please note that the following Gradle tasks generate both indy and non indy variants of the jars, so you don't need to use the system property:

* dist
* install
* uploadArchives

== Continuous Integration Server

The official CI server runs {groovy-ci}[here] and is sponsored by http://www.jetbrains.com[JetBrains].

== Java Profiler

Groovy core team tunes performance through YourKit Java Profiler, which is sponsored by https://www.yourkit.com[YourKit].

== Friends of Groovy Open Collective
As an independent initiative, we have set up an open collective for Groovy:

https://opencollective.com/friends-of-groovy

This initiative is designed to complement the Apache project and the many contributions we get from our great community and supporters.

* Thank you to our Silver Sponsors:

image:{sponsors-silver-img}[]

* Thank you to our Bronze Sponsors:

image:{sponsors-bronze-img}[]

* Thank you to our backers (donating monthly):

image:{backers-monthly-img}[]

* Thank you to all our backers:

image:{backers-all-img}[]

== Stargazers over time

image::https://starcharts.herokuapp.com/apache/groovy.svg[Stargazers over time, link=https://starcharts.herokuapp.com/apache/groovy]

== License

Groovy is licensed under the terms of the http://www.apache.org/licenses/LICENSE-2.0.html[Apache License, Version 2.0]

