diff --git a/src/asset/localInstance/defaults/service/systemd.conf b/src/asset/localInstance/defaults/service/systemd.conf index ab4bd271f..b92912d50 100644 --- a/src/asset/localInstance/defaults/service/systemd.conf +++ b/src/asset/localInstance/defaults/service/systemd.conf @@ -16,6 +16,7 @@ LimitNOFILE={{ instance.serviceOpts['limitNoFile'] }} KillMode=none ExecStart={{instance.dir}}/service/start.sh +ExecStartPost=/bin/sleep 5s ExecStop=-{{instance.dir}}/service/stop.sh [Install] diff --git a/src/asset/localInstance/defaults/start.bat b/src/asset/localInstance/defaults/start.bat index 962a5df49..a1e283994 100644 --- a/src/asset/localInstance/defaults/start.bat +++ b/src/asset/localInstance/defaults/start.bat @@ -1,3 +1,5 @@ +set JAVA_EXECUTABLE={{ java.executablePath }} + set CQ_PORT={{instance.httpPort}} set CQ_RUNMODE={{instance.runModesString}} set CQ_JVM_OPTS={{instance.jvmOptsString}} diff --git a/src/asset/localInstance/defaults/start.sh b/src/asset/localInstance/defaults/start.sh index 5523eb6cc..5f702df5e 100644 --- a/src/asset/localInstance/defaults/start.sh +++ b/src/asset/localInstance/defaults/start.sh @@ -1,5 +1,7 @@ #!/bin/sh +export JAVA_EXECUTABLE='{{ java.executablePath }}' + export CQ_PORT={{instance.httpPort}} export CQ_RUNMODE='{{instance.runModesString}}' export CQ_JVM_OPTS='{{instance.jvmOptsString}}' diff --git a/src/asset/localInstance/defaults/status.bat b/src/asset/localInstance/defaults/status.bat index 8d70b0c0f..cd6f5be45 100644 --- a/src/asset/localInstance/defaults/status.bat +++ b/src/asset/localInstance/defaults/status.bat @@ -1 +1,3 @@ +set JAVA_EXECUTABLE={{ java.executablePath }} + call crx-quickstart\bin\status.bat \ No newline at end of file diff --git a/src/asset/localInstance/defaults/status.sh b/src/asset/localInstance/defaults/status.sh index 1c1fe6862..04eefd605 100644 --- a/src/asset/localInstance/defaults/status.sh +++ b/src/asset/localInstance/defaults/status.sh @@ -1,4 +1,6 @@ #!/bin/sh +export JAVA_EXECUTABLE='{{ java.executablePath }}' + chmod u+x crx-quickstart/bin/status ./crx-quickstart/bin/status \ No newline at end of file diff --git a/src/asset/localInstance/defaults/stop.bat b/src/asset/localInstance/defaults/stop.bat index a94012c6b..42ab9ca47 100644 --- a/src/asset/localInstance/defaults/stop.bat +++ b/src/asset/localInstance/defaults/stop.bat @@ -1 +1,3 @@ +set JAVA_EXECUTABLE={{ java.executablePath }} + call crx-quickstart/bin/stop.bat \ No newline at end of file diff --git a/src/asset/localInstance/defaults/stop.sh b/src/asset/localInstance/defaults/stop.sh index a6d4efc80..a8fb8db47 100644 --- a/src/asset/localInstance/defaults/stop.sh +++ b/src/asset/localInstance/defaults/stop.sh @@ -1,4 +1,6 @@ #!/bin/sh +export JAVA_EXECUTABLE='{{ java.executablePath }}' + chmod u+x crx-quickstart/bin/stop ./crx-quickstart/bin/stop \ No newline at end of file diff --git a/src/main/kotlin/com/cognifide/gradle/aem/common/CommonOptions.kt b/src/main/kotlin/com/cognifide/gradle/aem/common/CommonOptions.kt index 1032c7965..f35a54a4d 100644 --- a/src/main/kotlin/com/cognifide/gradle/aem/common/CommonOptions.kt +++ b/src/main/kotlin/com/cognifide/gradle/aem/common/CommonOptions.kt @@ -1,7 +1,9 @@ package com.cognifide.gradle.aem.common import com.cognifide.gradle.aem.AemExtension +import com.cognifide.gradle.aem.common.instance.JavaOptions import com.cognifide.gradle.aem.common.utils.LineSeparator +import com.cognifide.gradle.common.utils.using import org.gradle.internal.os.OperatingSystem open class CommonOptions(private val aem: AemExtension) { @@ -55,4 +57,11 @@ open class CommonOptions(private val aem: AemExtension) { convention(aem.project.provider { if (OperatingSystem.current().isWindows) ".bat" else "" }) aem.prop.string("executableExtension")?.let { set(it) } } + + /** + * Configure Java for running AEM instance. + */ + val java by lazy { JavaOptions(aem) } + + fun java(options: JavaOptions.() -> Unit) = java.using(options) } diff --git a/src/main/kotlin/com/cognifide/gradle/aem/common/instance/JavaOptions.kt b/src/main/kotlin/com/cognifide/gradle/aem/common/instance/JavaOptions.kt new file mode 100644 index 000000000..47fc660cc --- /dev/null +++ b/src/main/kotlin/com/cognifide/gradle/aem/common/instance/JavaOptions.kt @@ -0,0 +1,19 @@ +package com.cognifide.gradle.aem.common.instance + +import com.cognifide.gradle.aem.AemExtension +import java.io.File + +class JavaOptions(aem: AemExtension) { + + val homeDir = aem.obj.dir { + set(File(System.getProperty("java.home"))) + } + + val homePath get() = homeDir.get().asFile.absolutePath + + val executableFile = aem.obj.file { + set(homeDir.file("bin/java")) + } + + val executablePath get() = executableFile.get().asFile.absolutePath +} \ No newline at end of file diff --git a/src/main/kotlin/com/cognifide/gradle/aem/common/instance/LocalInstance.kt b/src/main/kotlin/com/cognifide/gradle/aem/common/instance/LocalInstance.kt index 4db5e01d8..2161b86ee 100644 --- a/src/main/kotlin/com/cognifide/gradle/aem/common/instance/LocalInstance.kt +++ b/src/main/kotlin/com/cognifide/gradle/aem/common/instance/LocalInstance.kt @@ -183,7 +183,7 @@ class LocalInstance private constructor(aem: AemExtension) : Instance(aem) { return if (os.isWindows) { Script(this, listOf("cmd", "/C"), dir.resolve("$name.bat"), quickstartDir.resolve("bin/$name.bat")) } else { - Script(this, listOf("sh"), dir.resolve(name), quickstartDir.resolve("bin/$name")) + Script(this, listOf("sh"), dir.resolve("$name.sh"), quickstartDir.resolve("bin/$name")) } } @@ -263,6 +263,18 @@ class LocalInstance private constructor(aem: AemExtension) : Instance(aem) { result } + // Use java executable path explicitly to make instance working even when running from non-interactive shells (e.g as systemd service). + aem.project.fileTree(dir) + .matching { it.include(localManager.executableFiles.get()) } + .forEach { file -> + FileOperations.amendFile(file) { + it.replace("java ", when (file.extension) { + "bat" -> "%JAVA_EXECUTABLE% " + else -> "\$JAVA_EXECUTABLE " + }) + } + } + // Ensure that 'logs' directory exists logsDir.mkdirs() } @@ -306,7 +318,11 @@ class LocalInstance private constructor(aem: AemExtension) : Instance(aem) { } private fun expandFiles() { - val propertiesAll = mapOf("instance" to this) + properties + localManager.expandProperties.get() + val propertiesAll = mapOf( + "instance" to this, + "java" to aem.commonOptions.java + ) + properties + localManager.expandProperties.get() + aem.project.fileTree(dir) .matching { it.include(localManager.expandFiles.get()) } .forEach { file -> @@ -332,7 +348,7 @@ class LocalInstance private constructor(aem: AemExtension) : Instance(aem) { private fun makeFilesExecutable() { aem.project.fileTree(dir) - .matching { it.include(localManager.executableFiles.get()) } + .matching { it.include(localManager.executableFiles.get()).exclude("**/*.bat") } .forEach { FileOperations.makeExecutable(it) } } diff --git a/src/main/kotlin/com/cognifide/gradle/aem/common/instance/LocalInstanceManager.kt b/src/main/kotlin/com/cognifide/gradle/aem/common/instance/LocalInstanceManager.kt index ceb83e34f..e4b458d04 100644 --- a/src/main/kotlin/com/cognifide/gradle/aem/common/instance/LocalInstanceManager.kt +++ b/src/main/kotlin/com/cognifide/gradle/aem/common/instance/LocalInstanceManager.kt @@ -104,9 +104,9 @@ class LocalInstanceManager(internal val aem: AemExtension) : Serializable { /** * System service related options. */ - val service by lazy { Service(aem) } + val service by lazy { ServiceOptions(aem) } - fun service(options: Service.() -> Unit) = service.using(options) + fun service(options: ServiceOptions.() -> Unit) = service.using(options) fun resolveFiles() { logger.info("Resolving local instance files") @@ -158,12 +158,15 @@ class LocalInstanceManager(internal val aem: AemExtension) : Serializable { */ val expandFiles = aem.obj.strings { convention(listOf( - "start.bat", - "stop.bat", - "start.sh", - "stop.sh", + "*.sh", + "*.bat", + "service/*.sh", "service/*.conf", - "service/*.sh" + "crx-quickstart/bin/*.sh", + "crx-quickstart/bin/*.bat", + "crx-quickstart/bin/start", + "crx-quickstart/bin/status", + "crx-quickstart/bin/stop" )) } @@ -173,7 +176,13 @@ class LocalInstanceManager(internal val aem: AemExtension) : Serializable { val executableFiles = aem.obj.strings { convention(listOf( "*.sh", - "service/*.sh" + "*.bat", + "service/*.sh", + "crx-quickstart/bin/*.sh", + "crx-quickstart/bin/*.bat", + "crx-quickstart/bin/start", + "crx-quickstart/bin/status", + "crx-quickstart/bin/stop" )) } @@ -570,7 +579,7 @@ class LocalInstanceManager(internal val aem: AemExtension) : Serializable { try { logger.debug("Examining Java properly installed") - val result = ProcBuilder("java", "-version") + val result = ProcBuilder(aem.commonOptions.java.executablePath, "-version") .withWorkingDirectory(rootDir.get().asFile.apply { mkdirs() }) .withTimeoutMillis(statusTimeout.get()) .withExpectedExitStatuses(0) diff --git a/src/main/kotlin/com/cognifide/gradle/aem/common/instance/Service.kt b/src/main/kotlin/com/cognifide/gradle/aem/common/instance/ServiceOptions.kt similarity index 96% rename from src/main/kotlin/com/cognifide/gradle/aem/common/instance/Service.kt rename to src/main/kotlin/com/cognifide/gradle/aem/common/instance/ServiceOptions.kt index 852805623..df25c6840 100644 --- a/src/main/kotlin/com/cognifide/gradle/aem/common/instance/Service.kt +++ b/src/main/kotlin/com/cognifide/gradle/aem/common/instance/ServiceOptions.kt @@ -5,7 +5,7 @@ import com.cognifide.gradle.aem.AemExtension /** * System service related options. */ -class Service(private val aem: AemExtension) { +class ServiceOptions(private val aem: AemExtension) { val user = aem.obj.string { convention("aem")