This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch runq
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 93b315e1c63d25d58f1186b4670ad6175693ef2e
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Sat Apr 20 11:00:05 2024 +0200

    CAMEL-19041: camel-jbang - Run with runtime for spring-boot and quarkus
---
 .../dsl/jbang/core/commands/ExportBaseCommand.java    | 19 ++++++++++++++++++-
 .../org/apache/camel/dsl/jbang/core/commands/Run.java | 10 ++++++++--
 2 files changed, 26 insertions(+), 3 deletions(-)

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 33dedbed9e3..c741b4e4db1 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
@@ -218,6 +218,8 @@ abstract class ExportBaseCommand extends CamelCommand {
                         description = "Whether to ignore route loading and 
compilation errors (use this with care!)")
     protected boolean ignoreLoadingError;
 
+    protected boolean symbolicLink; // copy source files using symbolic link
+
     public ExportBaseCommand(CamelJBangMain main) {
         super(main);
     }
@@ -710,7 +712,7 @@ abstract class ExportBaseCommand extends CamelCommand {
         return "3.4.0";
     }
 
-    protected static void safeCopy(File source, File target, boolean override) 
throws Exception {
+    protected void safeCopy(File source, File target, boolean override) throws 
Exception {
         if (!source.exists()) {
             return;
         }
@@ -728,6 +730,21 @@ abstract class ExportBaseCommand extends CamelCommand {
             return;
         }
 
+        if (symbolicLink) {
+            try {
+                // must use absolute paths
+                Path link = target.toPath().toAbsolutePath();
+                Path src = source.toPath().toAbsolutePath();
+                if (Files.exists(link)) {
+                    Files.delete(link);
+                }
+                Files.createSymbolicLink(link, src);
+                return; // success
+            } catch (IOException e) {
+                // ignore
+            }
+        }
+
         if (!target.exists()) {
             Files.copy(source.toPath(), target.toPath());
         } else if (override) {
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 e435f3c3f82..c1ae2853bb7 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
@@ -850,6 +850,7 @@ public class Run extends CamelCommand {
     protected int runQuarkus() throws Exception {
         // export to hidden folder
         ExportQuarkus eq = new ExportQuarkus(getMain());
+        eq.symbolicLink = true;
         eq.quarkusVersion = this.quarkusVersion;
         eq.camelVersion = this.camelVersion;
         eq.kameletsVersion = this.kameletsVersion;
@@ -904,6 +905,7 @@ public class Run extends CamelCommand {
     protected int runSpringBoot() throws Exception {
         // export to hidden folder
         ExportSpringBoot eq = new ExportSpringBoot(getMain());
+        eq.symbolicLink = true;
         eq.springBootVersion = this.springBootVersion;
         eq.camelVersion = this.camelVersion;
         eq.camelSpringBootVersion = this.camelVersion;
@@ -922,6 +924,10 @@ public class Run extends CamelCommand {
         } else {
             eq.dependencies += ",camel:cli-connector";
         }
+        if (this.dev) {
+            // hot-reload of spring-boot
+            eq.dependencies += 
",mvn:org.springframework.boot:spring-boot-devtools";
+        }
         eq.fresh = this.fresh;
         eq.download = this.download;
         eq.quiet = true;
@@ -933,7 +939,7 @@ public class Run extends CamelCommand {
         // TODO: run in unique sub folder
         // TODO: delete sub folder on exit
         // TODO: camel log from spring-boot/quarkus is not possible
-        // TODO: copy files using symbolic link so you can edit the file
+        // TODO: copy files using symbolic link so you can edit the file 
(TODO: application.properties)
         // TODO: camel stop does not stop quarkus correctly (spring boot do 
that)
         // TODO: camel get does not show Quarkus as platform (spring boot do 
that)
 
@@ -942,7 +948,7 @@ public class Run extends CamelCommand {
         if (exit != 0) {
             return exit;
         }
-        // run quarkus via maven
+        // run spring-boot via maven
         ProcessBuilder pb = new ProcessBuilder();
         pb.command(ExportBaseCommand.RUN_DIR + "/mvnw", "--quiet", "--file", 
ExportBaseCommand.RUN_DIR, "spring-boot:run");
 

Reply via email to