diff --git a/cameleer-server-app/src/main/java/com/cameleer/server/app/runtime/DockerRuntimeOrchestrator.java b/cameleer-server-app/src/main/java/com/cameleer/server/app/runtime/DockerRuntimeOrchestrator.java index 80648ae1..37c90024 100644 --- a/cameleer-server-app/src/main/java/com/cameleer/server/app/runtime/DockerRuntimeOrchestrator.java +++ b/cameleer-server-app/src/main/java/com/cameleer/server/app/runtime/DockerRuntimeOrchestrator.java @@ -121,9 +121,12 @@ public class DockerRuntimeOrchestrator implements RuntimeOrchestrator { case "plain-java" -> "exec java -javaagent:/app/agent.jar -cp " + appJarPath + ":/app/cameleer-log-appender.jar" + customArgs + " " + request.mainClass(); case "native" -> "exec " + appJarPath + customArgs; - default -> // spring-boot (default) - "exec java -javaagent:/app/agent.jar -Dloader.path=/app/cameleer-log-appender.jar" + - customArgs + " -cp " + appJarPath + " org.springframework.boot.loader.launch.PropertiesLauncher"; + default -> { // spring-boot (default) + String launcher = request.mainClass() != null ? request.mainClass() + : "org.springframework.boot.loader.launch.PropertiesLauncher"; + yield "exec java -javaagent:/app/agent.jar -Dloader.path=/app/cameleer-log-appender.jar" + + customArgs + " -cp " + appJarPath + " " + launcher; + } }; createCmd.withEntrypoint("sh", "-c", entrypoint); diff --git a/cameleer-server-core/src/main/java/com/cameleer/server/core/runtime/RuntimeDetector.java b/cameleer-server-core/src/main/java/com/cameleer/server/core/runtime/RuntimeDetector.java index 339d7553..af1302b6 100644 --- a/cameleer-server-core/src/main/java/com/cameleer/server/core/runtime/RuntimeDetector.java +++ b/cameleer-server-core/src/main/java/com/cameleer/server/core/runtime/RuntimeDetector.java @@ -48,8 +48,11 @@ public final class RuntimeDetector { } // Spring Boot: any launcher in org.springframework.boot.loader + // Derive PropertiesLauncher from the same package as the detected launcher + // (3.2+ uses org.springframework.boot.loader.launch.*, pre-3.2 uses org.springframework.boot.loader.*) if (mainClass.startsWith("org.springframework.boot.loader")) { - return new DetectionResult(RuntimeType.SPRING_BOOT, null); + String loaderPackage = mainClass.substring(0, mainClass.lastIndexOf('.')); + return new DetectionResult(RuntimeType.SPRING_BOOT, loaderPackage + ".PropertiesLauncher"); } // Quarkus diff --git a/cameleer-server-core/src/test/java/com/cameleer/server/core/runtime/RuntimeDetectorTest.java b/cameleer-server-core/src/test/java/com/cameleer/server/core/runtime/RuntimeDetectorTest.java index bcb2473f..ac68bd24 100644 --- a/cameleer-server-core/src/test/java/com/cameleer/server/core/runtime/RuntimeDetectorTest.java +++ b/cameleer-server-core/src/test/java/com/cameleer/server/core/runtime/RuntimeDetectorTest.java @@ -44,7 +44,7 @@ class RuntimeDetectorTest { Path jar = createJarWithMainClass("org.springframework.boot.loader.launch.JarLauncher"); RuntimeDetector.DetectionResult result = RuntimeDetector.detect(jar); assertEquals(RuntimeType.SPRING_BOOT, result.runtimeType()); - assertNull(result.mainClass()); + assertEquals("org.springframework.boot.loader.launch.PropertiesLauncher", result.mainClass()); } @Test @@ -52,7 +52,7 @@ class RuntimeDetectorTest { Path jar = createJarWithMainClass("org.springframework.boot.loader.launch.PropertiesLauncher"); RuntimeDetector.DetectionResult result = RuntimeDetector.detect(jar); assertEquals(RuntimeType.SPRING_BOOT, result.runtimeType()); - assertNull(result.mainClass()); + assertEquals("org.springframework.boot.loader.launch.PropertiesLauncher", result.mainClass()); } @Test @@ -60,7 +60,7 @@ class RuntimeDetectorTest { Path jar = createJarWithMainClass("org.springframework.boot.loader.JarLauncher"); RuntimeDetector.DetectionResult result = RuntimeDetector.detect(jar); assertEquals(RuntimeType.SPRING_BOOT, result.runtimeType()); - assertNull(result.mainClass()); + assertEquals("org.springframework.boot.loader.PropertiesLauncher", result.mainClass()); } @Test