Gradle mit UTF-8 Byte Order Mark

Während Gradle absolut wunderbar mit UTF-8 funktioniert, gibt es hier leider eine Untiefe, die einen erwischen kann, wenn die Gradle Dateien z. B. mit dem Programm “Editor” unter Windows bearbeitet werden.

C:\test>gradle build
FAILURE: Build failed with an exception.
Where:
Build file 'C:\test\build.gradle' line: 9
What went wrong:
Could not compile build file 'C:\test\build.gradle'.
startup failed:
build file 'C:\test\build.gradle': 9: only buildscript {} and other plugins {} script blocks are allowed before plugins {} blocks, no other statements are allowed
See https://docs.gradle.org/5.1/userguide/plugins.html#sec:plugins_block for information on the plugins {} block
@ line 9, column 1.
plugins {
^
1 error
Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
Get more help at https://help.gradle.org
BUILD FAILED in 1s

Plötzlich und ohne Vorwarnung funktioniert dann einfach nix mehr, nicht einmal ein vermeintlich leeres Skript kompiliert. Was ist passiert? Optisch ist kein Unterschied an der Datei zu der letzten funktionierenden Version feststellbar. Allerdings, wenn die betroffene Datei in einem Hex Editor geöffnet wird:

Anfang einer gradle.build Datei mit UTF8-BOM

Achten wir auf die ersten Zeichen in der Datei. Hierbei handelt es sich um einen UTF-8-Byte Order Mark (BOM), einen festgelegten Wert, der die Datei als UTF-8 auszeichnet. Dieses ist optional. Bei Java (und Groovy, woraus letztendlich ein Gradle Skript besteht) sollten diese jedoch weggelassen werden, da der Compiler diese nicht verarbeitet: https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4508058

Wenn nun in einem Projekt dieses Problem auftritt, wie lässt sich das schnell lösen? Einige Editoren (z. B. Notepad++) erlauben es auszuwählen, ob die Datei mit BOM oder ohne gespeichert wird, und können zwischen den Varianten konvertieren.

Alternativ ist es möglich, mit Eclipse kurzfristig das Source-Encoding auf ein nicht UTF-basiertes Encoding zu stellen, womit die ersten drei Bytes wie oben im Hex Editor sichtbar erscheinen und einfach gelöscht werden können.

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

Leave a Reply