# Groovy Rules for Bazel ## Overview These build rules are used for building [Groovy](http://www.groovy-lang.org/) projects with Bazel. Groovy libraries may interoperate with and depend on Java libraries and vice-versa. * [Setup](#setup) * [Basic Example](#basic-example) * [Build Rule Reference](#reference) * [`groovy_library`](#groovy_library) * [`groovy_and_java_library`](#groovy_and_java_library) * [`groovy_binary`](#groovy_binary) ## Setup To be able to use the Groovy rules, you must provide bindings for the following targets: * `//external:groovy-sdk`, pointing at the [Groovy SDK binaries](http://www.groovy-lang.org/download.html) * `//external:junit`, pointing at JUnit (only required if using `groovy_test`) The easiest way to do so is by copying the content of `groovy.WORKSPACE` to your workspace file and putting `groovy.BUILD` at the root of your workspace. ## Basic Example Suppose you have the following directory structure for a simple Groovy and Java application: ``` [workspace]/ WORKSPACE src/main/groovy/ app/ BUILD GroovyApp.groovy lib/ BUILD GroovyLib.groovy JavaLib.java src/test/groovy/ lib/ BUILD LibTest.groovy ``` Then, to build the code under src/main/groovy/lib/, your `src/main/groovy/lib/BUILD` can look like this: ```python load("/tools/build_rules/groovy/groovy", "groovy_library") groovy_library( name = "groovylib", srcs = glob(["*.groovy"]), deps = [ ":javalib", ], ) java_library( name = "javalib", srcs = glob(["*.java"]), ) ``` For simplicity, you can combine Groovy and Java sources into a single library using `groovy_and_java_library`. Note that this allows the Groovy code to reference the Java code, but not vice-versa. Your `src/main/groovy/lib/BUILD` file would then look like this: ```python load("/tools/build_rules/groovy/groovy", "groovy_and_java_library") groovy_and_java_library( name = "lib", srcs = glob(["*.groovy", "*.java"]), ) ``` To build the application under src/main/groovy/app, you can define a binary using `groovy_binary` as follows: ```python load("/tools/build_rules/groovy/groovy", "groovy_binary") groovy_binary( name = "GroovyApp", srcs = glob(["*.groovy"]), main_class = "GroovyApp", deps = [ "//src/main/groovy/lib", ], ) ``` Finally, you can write tests in Groovy using `groovy_test`. The `srcs` of this rule will be converted into names of class files that are passed to JUnit. For this to work, the test sources must be under src/test/groovy or src/test/java. To build the test under src/test/groovy/lib, your BUILD file would look like this: ```python load("/tools/build_defs/groovy/groovy", "groovy_test", "groovy_library") groovy_library( name = "testlib", srcs = glob(["*.groovy"]), ) groovy_test( name = "LibTest", srcs = ["LibTest.groovy"], deps = [":testlib"], ) ``` ## Build Rule Reference [reference] ### `groovy_library` `groovy_library(name, srcs, deps, **kwargs)`
Attribute Description
name Name, required

A unique name for this rule.

srcs List of labels, required

List of .groovy source files used to build the library.

deps List of labels or .jar files, optional

List of other libraries to be included on the compile-time classpath when building this library.

These can be either other `groovy_library` targets, `java_library` targets, `groovy_and_java_library` targets, or raw .jar files.

**kwargs see java_binary

The other arguments of this rule will be passed to the `java_import` that wraps the groovy library.

### `groovy_and_java_library` `groovy_and_java_library(name, srcs, deps, **kwargs)`
Attribute Description
name Name, required

A unique name for this rule.

srcs List of labels, required

List of .groovy and .java source files used to build the library.

deps List of labels or .jar files, optional

List of other libraries to be included on the compile-time classpath when building this library.

These can be either other `groovy_library` targets, `java_library` targets, `groovy_and_java_library` targets, or raw .jar files.

**kwargs see java_binary

The other arguments of this rule will be passed to the `java_import` that wraps the groovy library.

### `groovy_binary` `groovy_binary(name, main_class, srcs, deps, **kwargs)`
Attribute Description
name Name, required

A unique name for this rule.

main_class String, required

The name of either a class containing a `main` method or a Groovy script file to use as an entry point (see here for more details on scripts vs. classes).

srcs List of labels, required

List of .groovy source files used to build the application.

deps List of labels or .jar files, optional

List of other libraries to be included on both the compile-time classpath when building this application and the runtime classpath when executing it.

These can be `groovy_library` targets, `java_library` targets, `groovy_and_java_library` targets, or raw .jar files.

**kwargs see java_binary

The other arguments of this rule will be passed to the `java_binary` underlying the `groovy_binary`.

### `groovy_test` `groovy_test(name, deps, srcs, data, resources, jvm_flags, size, tags)`
Attribute Description
name Name, required

A unique name for this rule.

srcs List of labels, required

List of .groovy source files whose names will be converted to classes passed to JUnitCore.

deps List of labels or .jar files, optional

List of libraries to be included on both the compile-time classpath when building this test and on the runtime classpath when executing it.

These can be `groovy_library` targets, `java_library` targets, `groovy_and_java_library` targets, or raw .jar files.

resources List of labels, optional

A list of data files to include on the test's classpath. This is accomplished by creating a `java_library` containing only the specified resources and including that library in the test's dependencies.

jvm_flags List of strings, optional

A list of flags to embed in the wrapper script generated for running this binary.