This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch feature/CAMEL-23857-tui-runtime-chooser in repository https://gitbox.apache.org/repos/asf/camel.git
commit d87ff187fff1a91c2ecef426247d883d2e2a7e95 Author: Claus Ibsen <[email protected]> AuthorDate: Mon Jun 29 21:44:02 2026 +0200 CAMEL-23857: camel export pass profile to exported application.properties and TUI restart for Spring Boot/Quarkus Co-Authored-By: Claude Opus 4.6 <[email protected]> Signed-off-by: Claus Ibsen <[email protected]> --- .../dsl/jbang/core/commands/ExportBaseCommand.java | 5 ++ .../apache/camel/dsl/jbang/core/commands/Run.java | 2 + .../dsl/jbang/core/commands/tui/CamelMonitor.java | 85 ++++++++++++++++++++++ 3 files changed, 92 insertions(+) diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java index d6bf27e829e1..4465ccc09146 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java @@ -1011,6 +1011,11 @@ public abstract class ExportBaseCommand extends CamelCommand { customize.apply(profileProps); } + // include camel profile if set (so exported runtimes like Spring Boot and Quarkus know the profile) + if (this.profile != null && !profileProps.containsKey("camel.main.profile")) { + profileProps.put("camel.main.profile", this.profile); + } + StringBuilder content = new StringBuilder(); for (Map.Entry<Object, Object> entry : profileProps.entrySet()) { String k = entry.getKey().toString(); diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java index a1781a745a3a..f6c852b81348 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java @@ -1362,6 +1362,7 @@ public class Run extends CamelCommand { eq.loggingLevel = "off"; eq.ignoreLoadingError = this.ignoreLoadingError; eq.lazyBean = this.lazyBean; + eq.profile = this.profile; eq.applicationProperties = this.property; printer().println("Running using Quarkus (preparing and downloading files)"); @@ -1478,6 +1479,7 @@ public class Run extends CamelCommand { eq.loggingLevel = "off"; eq.ignoreLoadingError = this.ignoreLoadingError; eq.lazyBean = this.lazyBean; + eq.profile = this.profile; eq.applicationProperties = this.property; printer().println("Running using Spring Boot (preparing and downloading files)"); diff --git a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java index 1d38c39ac4c1..7fdddbce43a7 100644 --- a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java +++ b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java @@ -1195,6 +1195,91 @@ public class CamelMonitor extends CamelCommand { return; } + String platform = info.platform; + boolean isSpringBoot = "Spring Boot".equals(platform); + boolean isQuarkus = "Quarkus".equals(platform); + + if (isSpringBoot || isQuarkus) { + restartMavenBasedProcess(ph, info, isSpringBoot); + } else { + restartCamelMainProcess(ph, info); + } + } + + private void restartMavenBasedProcess(ProcessHandle ph, IntegrationInfo info, boolean springBoot) { + String directory = info.directory; + if (directory == null || directory.isEmpty()) { + setNotification("Cannot restart: directory not available", true); + return; + } + + Path dirPath = Path.of(directory); + boolean windows = System.getProperty("os.name", "").toLowerCase(Locale.ROOT).contains("win"); + String mvnw = windows ? "mvnw.cmd" : "mvnw"; + Path mvnwPath = dirPath.resolve(mvnw); + if (!Files.isRegularFile(mvnwPath)) { + setNotification("Cannot restart: Maven wrapper not found", true); + return; + } + + String name = info.name; + ctx.lastSelectedName = name; + + // kill the process (Maven parent will also exit) + ph.destroy(); + setNotification("Restarting: " + name, false); + + if (runner != null) { + runner.scheduler().execute(() -> { + try { + // wait for process termination + try { + ph.onExit().toCompletableFuture().get(10, TimeUnit.SECONDS); + } catch (Exception e) { + ph.destroyForcibly(); + Thread.sleep(500); + } + // also wait for parent (Maven) to exit + ProcessHandle parent = ph.parent().orElse(null); + if (parent != null && parent.isAlive()) { + try { + parent.onExit().toCompletableFuture().get(5, TimeUnit.SECONDS); + } catch (Exception e) { + parent.destroyForcibly(); + } + } + + // re-launch via Maven wrapper + List<String> cmd = new ArrayList<>(); + cmd.add(mvnwPath.toString()); + cmd.add("--quiet"); + cmd.add("--file"); + cmd.add(dirPath.resolve("pom.xml").toString()); + if (springBoot) { + cmd.add("spring-boot:run"); + } else { + cmd.add("package"); + cmd.add("quarkus:dev"); + } + + ProcessBuilder pb = new ProcessBuilder(cmd); + pb.directory(dirPath.toFile()); + pb.redirectErrorStream(true); + Path outputFile = Files.createTempFile("camel-restart-", ".log"); + outputFile.toFile().deleteOnExit(); + pb.redirectOutput(outputFile.toFile()); + pb.start(); + + runner.runOnRenderThread(() -> setNotification("Restarted: " + name, false)); + } catch (Exception e) { + runner.runOnRenderThread( + () -> setNotification("Restart failed: " + e.getMessage(), true)); + } + }); + } + } + + private void restartCamelMainProcess(ProcessHandle ph, IntegrationInfo info) { // capture command line before stopping Optional<String> cmdOpt = ph.info().command(); Optional<String[]> argsOpt = ph.info().arguments();
