Gradle 4.6

Vor wenigen Tagen wurde Gradle 4.6 veröffentlicht, und wie immer sind einige interessante Änderungen dabei:

  • JUnit 5
  • BOM Unterstützung
  • Einschränkungen für transitive Abhängigkeiten
  • Optionale Abhängigkeiten
  • Eigene CMD Parameter für Tasks

JUnit 5

Die wohl größte Änderung dürfte der neue Support für JUnit 5 sein. Es wurden die beiden Engines für junit-jupiter (das neue System von JUnit) sowie junit-vintage (Kompatibilität für ältere Tests) integriert.

Um die neue JUnit Platform zu benutzten muss useJUnitPlatform() aufgerufen werden, sowie jupiter/vintage als Abhängigkeit hinzugefügt werden

test {
 useJUnitPlatform()
}
//um die neue Jupiter Engine zu benutzen (benötigt Java 8+)
dependencies {
 testImplementation 'org.junit.jupiter:junit-jupiter-api:5.1.0'
 testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.1.0'
}
//Um alte JUnit Tests zu benutzen
dependencies {
 testCompileOnly 'junit:junit:4.12' 
 testRuntimeOnly 'org.junit.vintage:junit-vintage-engine:5.1.0' 
}

Mittels JUnit 5 ist es jetzt auch einzelne Tests mit Tags zu versehen. Gradle 4.6 ermöglicht einen nach diesen zu filtern. Somit ist es z.B einfach möglich im CI einen schnellen Build durchzuführen um schnelle eine Rückmeldung zu bekommen, und ausführliche Tests erst bei bestehen zu starten. Hierzu gibt es excludeTags und includeTags, mit denen feingranular festgelegt werden kann welche Tests ausgeführt werden sollen. Zum Beispiel wird folgend Selenium Tests übersprungen, jedoch DoNeverSkip Tests trotzdem ausgeführt.

test {
 useJUnitPlatform {
     excludeTags 'Selenium'
     includeTags 'DoNeverSkip'
 }
}

Zudem neu hinzugekommen ist fail fast support für Tests, ist dieses gesetzt wird sofort nach dem ersten Fehlschlag abgebrochen, ohne die restlichen Tests zu starten.

test {
 failFast = true
}

BOM Import

Endlich ist es soweit, und BOM’s können direkt konsumiert werden:

dependencies {
 // import a BOM
 implementation 'org.springframework.boot:spring-boot-dependencies:1.5.8.RELEASE'

// define dependencies without versions
 implementation 'com.google.code.gson:gson'
 implementation 'dom4j:dom4j'
}

Einschränkungen für transitive Abhängigkeiten

Es ist jetzt möglich bei der Auflösung einzelne Versionen auch für transitive Dependencies zu verwenden. Zum Beispiel ist es möglich hiermit anzugeben das mindestens Version 1.11 von den commons-codecs verwendet werden soll. Jedoch im Gegensatz zu bisherigen Ansätzen wird nicht erzwungen genau 1.11 zu verwenden. Wenn eine andere Abhängigkeit 1.12 verwenden möchte, wird diese stattdessen benutzt. Zudem ist es jetzt möglich mithilfe von because eine saubere Erklärung direkt mit in den Build zu verpacken.

dependencies {
 implementation 'org.apache.httpcomponents:httpclient'
}

dependencies {
 constraints {
   implementation('commons-codec:commons-codec:1.11') {
     because 'version 1.9 pulled from httpclient has bugs affecting this application'
   }
 }
}

Optionale Abhängigkeiten

Gradle versteht jetzt optionale Abhängigkeiten von Maven richtig. Sofern durch eine Abhängigkeit das Deklarierte optionale Modul benötigt wird, wird bei der Auflösung entsprechend berücksichtigt welche Version angefordert wird (relevant wenn die optionale  Abhängigkeit eine neuere Version benötigt wie sonst angefordert war). Da dieses Feature noch im Preview ist und erst mit Gradle 5.0 standartmäßig aktiviert ist, muss für die Verwendung in die settings.gradle “enableFeaturePreview(‘IMPROVED_POM_SUPPORT’)” eingefügt werden.

Eigene CMD Parameter für Tasks

Gradle ermöglicht jetzt bei eigenen Tasks sehr einfach Kommandozeilen Argumente zu verwenden. Hierzu muss lediglich ein @Option an einen Setter deklariert werden:

import org.gradle.api.tasks.options.Option;

public class UrlVerify extends DefaultTask {
 private String url;

@Option(option = "url", description = "Configures the URL to be verified.")
public void setUrl(String url) {
 this.url = url;
}

@Input
public String getUrl() {
 return url;
}

@TaskAction
 public void verify() {
   //z.B die Url auflösen und den Inhalt herunterladen
 }
}

Zudem wurde ermöglicht einen CommandLineArgumentProvider an die Tasks Exec, JavaExec und Test zu hängen, welcher beliebige Argument übergeben kann.

 

Die englischen News und genauere Dokumentation zu den neuen Features finden sich wie immer auf der Gradle Seite: https://gradle.org/

Short URL for this post: https://wp.me/p4nxik-313
This entry was posted in Build, config and deploy and tagged , , . Bookmark the permalink.

Leave a Reply