Auto create shebang executable

Change-Id: I7105b82656b641910326d7bc38ce615d930ec04d
diff --git a/app/build.gradle b/app/build.gradle
index c50eecb..46e0d2a 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -136,8 +136,33 @@
     }
 }
 
+// Concatenate shebang + shaded jar into an executable launcher
+tasks.register('assembleShebangExecutable') {
+    dependsOn shadowJar
+    inputs.file(rootProject.file("korapxmltool.shebang"))
+    outputs.file(new File(shadowJar.archiveFile.get().asFile.parent, "korapxmltool"))
+
+    doLast {
+        def shebang = rootProject.file("korapxmltool.shebang")
+        if (!shebang.exists()) {
+            throw new GradleException("Missing shebang stub: ${shebang}")
+        }
+
+        def targetJar = shadowJar.archiveFile.get().asFile
+        def targetExec = new File(targetJar.parent, "korapxmltool")
+
+        targetExec.withOutputStream { os ->
+            os << shebang.bytes
+            os << targetJar.bytes
+        }
+        targetExec.setExecutable(true, true)
+        println "Created executable launcher: ${targetExec}"
+    }
+}
+
 tasks.named('build') {
     dependsOn createJarSymlink
+    dependsOn assembleShebangExecutable
 }