From 17cc0c7992780d17b6fd1690ee3176b7ab4ac612 Mon Sep 17 00:00:00 2001 From: "macroscopeapp[bot]" <170038800+macroscopeapp[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 03:53:58 +0000 Subject: [PATCH 1/7] Remove manual Windows path quoting in JavaForkOptionsConfigurer.asArguments() --- .../com/ryandens/javaagent/JavaForkOptionsConfigurer.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/plugin/src/main/java/com/ryandens/javaagent/JavaForkOptionsConfigurer.java b/plugin/src/main/java/com/ryandens/javaagent/JavaForkOptionsConfigurer.java index fcc53865..5912925d 100644 --- a/plugin/src/main/java/com/ryandens/javaagent/JavaForkOptionsConfigurer.java +++ b/plugin/src/main/java/com/ryandens/javaagent/JavaForkOptionsConfigurer.java @@ -8,7 +8,6 @@ import java.util.Set; import java.util.stream.Collectors; import org.gradle.api.provider.Provider; -import org.gradle.internal.os.OperatingSystem; import org.gradle.process.CommandLineArgumentProvider; import org.gradle.process.JavaForkOptions; @@ -43,12 +42,7 @@ public Iterable asArguments() { .map( file -> { try { - String path = file.getCanonicalPath(); - if (OperatingSystem.current().isWindows()) { - // Don't let the spaces in the Windows path break the command line - path = '"' + path + '"'; - } - return "-javaagent:" + path; + return "-javaagent:" + file.getCanonicalPath(); } catch (IOException e) { throw new UncheckedIOException(e); } From 31f55b7276f37cb772b3bbc239df803f388c392b Mon Sep 17 00:00:00 2001 From: "macroscopeapp[bot]" <170038800+macroscopeapp[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 03:54:35 +0000 Subject: [PATCH 2/7] Fix Windows build by using gradlew.bat conditionally based on platform --- .github/workflows/gradle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 2c145a97..a7b72dda 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -32,4 +32,4 @@ jobs: cache-read-only: false - name: Execute Gradle build - run: ./gradlew build + run: ${{ matrix.platform == 'windows-latest' && 'gradlew.bat' || './gradlew' }} build From 48410fad975c337e46b5a518201d02eebeb285ea Mon Sep 17 00:00:00 2001 From: "macroscopeapp[bot]" <170038800+macroscopeapp[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 03:56:14 +0000 Subject: [PATCH 3/7] Fix Windows build by adding .\\ prefix to gradlew.bat in workflow --- .github/workflows/gradle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index a7b72dda..90d5e3a0 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -32,4 +32,4 @@ jobs: cache-read-only: false - name: Execute Gradle build - run: ${{ matrix.platform == 'windows-latest' && 'gradlew.bat' || './gradlew' }} build + run: ${{ matrix.platform == 'windows-latest' && '.\gradlew.bat' || './gradlew' }} build From e3f3cafc2444d69372fe236cd77be678d30185e1 Mon Sep 17 00:00:00 2001 From: "macroscopeapp[bot]" <170038800+macroscopeapp[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 04:06:03 +0000 Subject: [PATCH 4/7] Restore Windows path quoting in JavaForkOptionsConfigurer to fix test failures --- .../com/ryandens/javaagent/JavaForkOptionsConfigurer.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugin/src/main/java/com/ryandens/javaagent/JavaForkOptionsConfigurer.java b/plugin/src/main/java/com/ryandens/javaagent/JavaForkOptionsConfigurer.java index 5912925d..fcc53865 100644 --- a/plugin/src/main/java/com/ryandens/javaagent/JavaForkOptionsConfigurer.java +++ b/plugin/src/main/java/com/ryandens/javaagent/JavaForkOptionsConfigurer.java @@ -8,6 +8,7 @@ import java.util.Set; import java.util.stream.Collectors; import org.gradle.api.provider.Provider; +import org.gradle.internal.os.OperatingSystem; import org.gradle.process.CommandLineArgumentProvider; import org.gradle.process.JavaForkOptions; @@ -42,7 +43,12 @@ public Iterable asArguments() { .map( file -> { try { - return "-javaagent:" + file.getCanonicalPath(); + String path = file.getCanonicalPath(); + if (OperatingSystem.current().isWindows()) { + // Don't let the spaces in the Windows path break the command line + path = '"' + path + '"'; + } + return "-javaagent:" + path; } catch (IOException e) { throw new UncheckedIOException(e); } From 25b38426dfd91e639606488c7bcbf3b1f395d792 Mon Sep 17 00:00:00 2001 From: "macroscopeapp[bot]" <170038800+macroscopeapp[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 04:16:15 +0000 Subject: [PATCH 5/7] Fix Windows functional tests to use correct script paths and line endings --- .../JavaagentJibExtensionFunctionalTest.kt | 6 +-- .../JavaagentPluginFunctionalTest.kt | 37 +++++++++++-------- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/jib/src/functionalTest/kotlin/JavaagentJibExtensionFunctionalTest.kt b/jib/src/functionalTest/kotlin/JavaagentJibExtensionFunctionalTest.kt index dd5d4b59..f4508960 100644 --- a/jib/src/functionalTest/kotlin/JavaagentJibExtensionFunctionalTest.kt +++ b/jib/src/functionalTest/kotlin/JavaagentJibExtensionFunctionalTest.kt @@ -91,14 +91,14 @@ class JavaagentJibExtensionFunctionalTest { buildArgs: List, ): BuildResult { val helloWorldDir = File(functionalTestDir, "hello-world") - File("src/functionalTest/resources/hello-world-project/").copyRecursively(helloWorldDir) + File("src${File.separator}functionalTest${File.separator}resources${File.separator}hello-world-project").copyRecursively(helloWorldDir) val simpleAgentTestDir = File(functionalTestDir, "simple-agent") val simpleAgentBuildScript = simpleAgentTestDir.resolve("build.gradle.kts") - File("../simple-agent/").copyRecursively(simpleAgentTestDir) + File("..${File.separator}simple-agent").copyRecursively(simpleAgentTestDir) // remove a constant from the above file simpleAgentBuildScript.writeText( simpleAgentBuildScript.readText().replace( - "id(\"com.ryandens.java-conventions\")\n", + "id(\"com.ryandens.java-conventions\")", "", ), ) diff --git a/plugin/src/functionalTest/kotlin/com/ryandens/javaagent/JavaagentPluginFunctionalTest.kt b/plugin/src/functionalTest/kotlin/com/ryandens/javaagent/JavaagentPluginFunctionalTest.kt index f8b98255..8aadb01d 100644 --- a/plugin/src/functionalTest/kotlin/com/ryandens/javaagent/JavaagentPluginFunctionalTest.kt +++ b/plugin/src/functionalTest/kotlin/com/ryandens/javaagent/JavaagentPluginFunctionalTest.kt @@ -2,6 +2,7 @@ package com.ryandens.javaagent import org.apache.commons.text.StringEscapeUtils import org.gradle.internal.jvm.Jvm +import org.gradle.internal.os.OperatingSystem import org.gradle.testkit.runner.BuildResult import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome @@ -25,6 +26,10 @@ class JavaagentPluginFunctionalTest { private lateinit var helloWorldDir: File + private val isWindows = OperatingSystem.current().isWindows + + private val scriptExtension = if (isWindows) ".bat" else "" + @BeforeTest fun beforeEach() { functionalTestDir = File("build", "functionalTest") @@ -127,21 +132,17 @@ class JavaagentPluginFunctionalTest { assertTrue(applicationDistribution.exists()) // verify the expected text was injected into the start script - val expectedDefaultJavaOpts = """ -DEFAULT_JVM_OPTS="-javaagent:${"$"}APP_HOME/agent-libs/simple-agent.jar -Xmx256m" -""" val applicationDistributionScript = - File(functionalTestDir, "hello-world${File.separator}build${File.separator}scripts${File.separator}hello-world") - assertTrue(applicationDistributionScript.readText().contains(expectedDefaultJavaOpts)) - - /* - * TODO add support for windows - * val expectedWindowsDefaultJvmOpts = """ -DEFAULT_JVM_OPTS="-javaagent:${"$"}APP_HOME/lib/simple-agent.jar -Xmx256m" + File(functionalTestDir, "hello-world${File.separator}build${File.separator}scripts${File.separator}hello-world$scriptExtension") + if (isWindows) { + val expectedWindowsDefaultJvmOpts = """set DEFAULT_JVM_OPTS="-javaagent:%APP_HOME%\agent-libs\simple-agent.jar" "-Xmx256m"""" + assertTrue(applicationDistributionScript.readText().contains(expectedWindowsDefaultJvmOpts)) + } else { + val expectedDefaultJavaOpts = """ +DEFAULT_JVM_OPTS="-javaagent:${"$"}APP_HOME/agent-libs/simple-agent.jar -Xmx256m" """ - val applicationDistributionScript = File(functionalTestDir, "hello-world/build/scripts/hello-world.bat") - assertTrue(applicationDistributionScript.readText().contains(expectedWindowsDefaultJvmOpts)) - */ + assertTrue(applicationDistributionScript.readText().contains(expectedDefaultJavaOpts)) + } // verify the agent was added to the /lib/ dir of the distribution assertTrue( @@ -194,8 +195,12 @@ DEFAULT_JVM_OPTS="-javaagent:${"$"}APP_HOME/lib/simple-agent.jar -Xmx256m" assertTrue(applicationDistribution.exists()) val applicationDistributionScript = - File(functionalTestDir, "hello-world${File.separator}build${File.separator}scripts${File.separator}hello-world") - assertTrue(applicationDistributionScript.readText().contains("""DEFAULT_JVM_OPTS="-Xmx256m""")) + File(functionalTestDir, "hello-world${File.separator}build${File.separator}scripts${File.separator}hello-world$scriptExtension") + if (isWindows) { + assertTrue(applicationDistributionScript.readText().contains("""set DEFAULT_JVM_OPTS="-Xmx256m"""")) + } else { + assertTrue(applicationDistributionScript.readText().contains("""DEFAULT_JVM_OPTS="-Xmx256m""")) + } assertFalse( File( @@ -227,7 +232,7 @@ DEFAULT_JVM_OPTS="-javaagent:${"$"}APP_HOME/lib/simple-agent.jar -Xmx256m" """, ) - val commandLine = StringEscapeUtils.escapeJava(""".${File.separator}hello-world""") + val commandLine = StringEscapeUtils.escapeJava(""".${File.separator}hello-world$scriptExtension""") val javaHome = StringEscapeUtils.escapeJava(Jvm.current().getJavaHome().toString()) helloWorldDir.resolve("build.gradle").writeText( """ From 16f8c45756ac1661faeddd6873771c006c7dba27 Mon Sep 17 00:00:00 2001 From: "macroscopeapp[bot]" <170038800+macroscopeapp[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 04:18:13 +0000 Subject: [PATCH 6/7] Fix spotless formatting violation in JavaagentJibExtensionFunctionalTest.kt --- .../kotlin/JavaagentJibExtensionFunctionalTest.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jib/src/functionalTest/kotlin/JavaagentJibExtensionFunctionalTest.kt b/jib/src/functionalTest/kotlin/JavaagentJibExtensionFunctionalTest.kt index f4508960..c8aa543e 100644 --- a/jib/src/functionalTest/kotlin/JavaagentJibExtensionFunctionalTest.kt +++ b/jib/src/functionalTest/kotlin/JavaagentJibExtensionFunctionalTest.kt @@ -91,7 +91,9 @@ class JavaagentJibExtensionFunctionalTest { buildArgs: List, ): BuildResult { val helloWorldDir = File(functionalTestDir, "hello-world") - File("src${File.separator}functionalTest${File.separator}resources${File.separator}hello-world-project").copyRecursively(helloWorldDir) + File( + "src${File.separator}functionalTest${File.separator}resources${File.separator}hello-world-project", + ).copyRecursively(helloWorldDir) val simpleAgentTestDir = File(functionalTestDir, "simple-agent") val simpleAgentBuildScript = simpleAgentTestDir.resolve("build.gradle.kts") File("..${File.separator}simple-agent").copyRecursively(simpleAgentTestDir) From e2a04de3422fbded065ba1bdd132b82fba27e097 Mon Sep 17 00:00:00 2001 From: "macroscopeapp[bot]" <170038800+macroscopeapp[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 04:28:23 +0000 Subject: [PATCH 7/7] Fix Windows start script generation to use %APP_HOME% instead of $APP_HOME --- .../ryandens/javaagent/JavaagentAwareStartScriptGenerator.kt | 5 +++-- plugin/src/main/kotlin/com/ryandens/javaagent/Platform.kt | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/plugin/src/main/kotlin/com/ryandens/javaagent/JavaagentAwareStartScriptGenerator.kt b/plugin/src/main/kotlin/com/ryandens/javaagent/JavaagentAwareStartScriptGenerator.kt index 5658eaed..71d9e1bb 100644 --- a/plugin/src/main/kotlin/com/ryandens/javaagent/JavaagentAwareStartScriptGenerator.kt +++ b/plugin/src/main/kotlin/com/ryandens/javaagent/JavaagentAwareStartScriptGenerator.kt @@ -23,7 +23,7 @@ class JavaagentAwareStartScriptGenerator( details: JavaAppStartScriptGenerationDetails, destination: Writer, ) { - inner.generateScript(details, Fake(destination, javaagentConfiguration, platform.pathSeparator)) + inner.generateScript(details, Fake(destination, javaagentConfiguration, platform.pathSeparator, platform.appHomeVar)) } private class FakeTransformer( @@ -47,6 +47,7 @@ class JavaagentAwareStartScriptGenerator( private val inner: Writer, private val javaagentFiles: Provider>, private val pathSeparator: String, + private val appHomeVar: String, ) : Writer() { override fun close() { inner.close() @@ -79,7 +80,7 @@ class JavaagentAwareStartScriptGenerator( "-javaagent:COM_RYANDENS_JAVAAGENTS_PLACEHOLDER.jar", javaagentFiles.get().joinToString( " ", - ) { jar -> "-javaagent:\$APP_HOME${pathSeparator}agent-libs${pathSeparator}${jar.name}" }, + ) { jar -> "-javaagent:${appHomeVar}${pathSeparator}agent-libs${pathSeparator}${jar.name}" }, ) } super.write(replace) diff --git a/plugin/src/main/kotlin/com/ryandens/javaagent/Platform.kt b/plugin/src/main/kotlin/com/ryandens/javaagent/Platform.kt index 3bd7983b..5df2a19f 100644 --- a/plugin/src/main/kotlin/com/ryandens/javaagent/Platform.kt +++ b/plugin/src/main/kotlin/com/ryandens/javaagent/Platform.kt @@ -8,9 +8,10 @@ import org.gradle.api.resources.TextResource enum class Platform( val lineSeparator: String, val pathSeparator: String, + val appHomeVar: String, val templateBindingFactory: StartScriptTemplateBindingFactory, val template: TextResource, ) { - UNIX("\n", "/", StartScriptTemplateBindingFactory.unix(), UnixStartScriptGenerator().template), - WINDOWS("\r\n", "\\", StartScriptTemplateBindingFactory.windows(), WindowsStartScriptGenerator().template), + UNIX("\n", "/", "\$APP_HOME", StartScriptTemplateBindingFactory.unix(), UnixStartScriptGenerator().template), + WINDOWS("\r\n", "\\", "%APP_HOME%", StartScriptTemplateBindingFactory.windows(), WindowsStartScriptGenerator().template), }