Gradle: Groovy Build Tool

Gradle ist ein Build-Tool - ähnlich Maven - für Java und Groovy Projekte. Anders als bei Maven wird das Buildskript aber in Groovy geschrieben - es entfällt also der Ärger, valides XML von Hand nieder zu schreiben.
Das sind die Schritte, die notwendig sind, um Gradle in Aktion sehen zu können:
  1. Download Gradle
  2. An beliebiger Stelle entpacken
  3. GRADLE_HOME Variable auf Verzeichnis setzen
  4. <GRADLE_HOME>/bin in PATH-Variable mit aufnehmen
Jetzt auf der Kommandozeile testen, ob alles geklappt hat: gradle -v
------------------------------------------------------------
Gradle 0.8
------------------------------------------------------------

Gradle buildtime: Monday, September 28, 2009 2:01:59 PM CEST
Groovy: 1.6.4
Ant: Apache Ant version 1.7.0 compiled on December 13 2006
Ivy: 2.1.0-rc2
Java: 1.6.0_14
JVM: 14.0-b16
JVM Vendor: Sun Microsystems Inc.
OS Name: Windows XP

Analog zur pom.xml bei Maven gibt es bei Gradle dei Datei build.gradle, welches im Projektverzeichnis liegen muss.

Einstellungen

Projektespezifische Daten:

group='de.ronnyfriedland
version='1.0-SNAPSHOT'

Definieren von Tasks: | Zusätzlich zu vordefinierte Tasks (z.B. durch Plugins), können eigene Tasks angelegt werden und in den Buildprozess integriert werden.

defaultTasks 'hello'

task hello << {
    println 'Hello world!'
}

Tasks - Abhängigkeiten:

Es ist möglich, das vor einem bestimmten Task ein anderer Task aufgerufen werden soll. Dafür genügt folgende Zeile:

install.dependsOn test

Damit wird festgelegt, dass vor dem Ausführen des Tasks "install" immer der Task "test" ausgeführt werden muss.

Plugins

  • java: Java Projekte
  • groovy: Groovy Projekte
  • maven: Maven Integration
  • ...
Mittels des Maven-Plugins ist es möglich, die gebauten Artefakt in ein

Repository zu installieren. | Der aufzurufende Task dafür ist gradle install.

Maven Repositories für Projekt-Dependencies definieren

repositories {
  //if jars are available in a folder called 'lib' within the project
  //flatDir name: 'localRepository', dirs: 'lib'

  //local maven repository
  mavenRepo urls: 'file:' + new File('d:/Development/Build/apache-maven-2.1.0/repository')

  //maven central repo
  mavenCentral()
}

Dependencies

dependencies {
  compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
  testCompile "junit:junit:3.8.1"

}
Damit wird festgelegt, dass für die Tests junit benötigt wird, zum

kompilieren commons-collections. | Für die Angabe der Dependencies sind beide Schreibweisen zulässig. Das zweite Format hat dabei den Aufbau: "<group>:<name>:<version>".

Multiprojekt

Auch mit gradle ist es möglich, in einem Projekt mehrere Subprojekte anzulegen. Dafür sind die folgenden Schritte nötig.

Achtung: Ich hatte Problem, sobald der Projektname Großbuchstaben enthielt. Die POM für das Maven Repository enthielt dabei als ArtifactId diese Großbuchstaben und das Modul wurde nicht mehr als Dependency gefunden.

Ordnerstruktur

| hauptprojekt
|  \|
|  \|-- subprojekt1
|  \|-- subprojekt2
|  ...

Einrichten

Im Hauptprojekt eine Datei settings.gradle anlegen. Diese enthält die Subprojekte:

include "subprojekt1"
include "subprojekt2"
Jetzt kann in der build.gradle ein Bereich definiert werden, der für

ALLE Projekte (allprojects) gilt, oder nur für die Subprojekte (subprojects). | In den Bereich allprojects gehört die Repositorykonfiguration, die Version, die Plugins, etc. ... | Unter subprojects habe ich die Dependencies angegeben, welche in allen Subprojekten genutzt werden.

allprojects {
    version = '1.0-SNAPSHOT'
    group = 'de.ronnyfriedland.test'

    usePlugin 'maven' //install artifacts to maven repo: "gradle install"
    usePlugin('java')
    usePlugin('eclipse') //create exlipse project files: "gradle eclipse"

    defaultTasks 'clean', 'test', 'install'

    sourceCompatibility = 1.5
    targetCompatibility = 1.5

    repositories {
      //if jars are available in a folder called 'lib' within the project
      //flatDir name: 'localRepository', dirs: 'hauptprojekt/lib'

      //local maven repository
      mavenRepo(urls: 'file:' + new File('d:/Development/Build/apache-maven-2.1.0/repository'))

      //maven central repo
      mavenCentral()
    }
}

subprojects {
    dependencies {
      compile group: 'log4j', name: 'log4j', version: '1.2.14'
      compile group: 'commons-logging', name: 'commons-logging', version: '1.1.1'
      compile group: 'commons-collections', name: 'commons-collections', version: '3.2.1'
      testCompile "junit:junit:4.4"
    }
}

artifactId = 'hauptprojekt'

In den jeweiligen build.gradle - Dateien der Subprojekte werden dann spezielle Dependencies nur für das Projekte definiert. Hier ein Beispielt für Subprojekt1:

artifactId = 'subprojekt1'

dependencies {
  compile project(':subprojekt2')
  compile group: 'opensymphony', name: 'quartz', version: '1.6.3'
}

In den Dependencies kann auch das eigene Subprojekt angegeben werden. In diesem Fall kommt es nicht aus dem Maven Repository.