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

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

commit 9e317871b4b0e133824776d02b32f9a74037c199
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Mon Apr 7 21:09:51 2025 +0200

    CAMEL-21939: camel-jbang: Fix export to not run twice, and also fix 
camel-export.log, and be able to log to console and add the verbose option also.
---
 .../modules/ROOT/pages/camel-jbang.adoc            | 11 ++++
 .../camel/dsl/jbang/core/commands/Export.java      | 17 ++++-
 .../dsl/jbang/core/commands/ExportBaseCommand.java | 31 +++++----
 .../dsl/jbang/core/commands/ExportCamelMain.java   |  2 +-
 .../dsl/jbang/core/commands/ExportQuarkus.java     |  2 +-
 .../dsl/jbang/core/commands/ExportSpringBoot.java  |  2 +-
 .../apache/camel/dsl/jbang/core/commands/Run.java  | 74 ++++++++++++++--------
 .../src/main/resources/log4j2-export.properties    |  2 +-
 .../src/main/resources/log4j2-script.properties    |  2 +-
 9 files changed, 95 insertions(+), 48 deletions(-)

diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc 
b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
index be05d715f5b..dd965e3c5b5 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
@@ -3766,6 +3766,17 @@ To be able to continue to use Camel CLI (i.e. `camel`), 
you need to add `camel:c
 camel export --runtime=quarkus --gav=com.foo:acme:1.0-SNAPSHOT 
--dep=camel:cli-connector --directory=../myproject
 ----
 
+=== Troubleshooting exporting
+
+When exporting then Camel CLI performs a set of tasks which can go wrong.
+To see more activity during exporting you can turn on both `--verbose` and 
`--logging` that
+prints more information to the console.
+
+If your Camel application cannot be exported, for example due to some custom 
Java code, you can
+try to export with `--ignore-loading-error`.
+
+TIP: Camel will by default store export logs to `<user 
home>/.camel/camel-export.log` file of the last export run (unless you turn on 
`--logging` that logs only to console).
+
 === Configuring exporting
 
 The export command will by default load configuration from 
`application.properties`
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
index 90b0c4a3af4..8f355c9ecbd 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
@@ -42,6 +42,11 @@ public class Export extends ExportBaseCommand {
         super(main);
     }
 
+    @Override
+    public boolean disarrangeLogging() {
+        return false; // export logs specially to a camel-export.log
+    }
+
     @Override
     protected Integer export() throws Exception {
         // application.properties
@@ -65,15 +70,16 @@ public class Export extends ExportBaseCommand {
             gav = "org.example.project:%s:%s".formatted(pn, getVersion());
         }
 
+        int answer;
         switch (runtime) {
             case springBoot -> {
-                return export(new ExportSpringBoot(getMain()));
+                answer = export(new ExportSpringBoot(getMain()));
             }
             case quarkus -> {
-                return export(new ExportQuarkus(getMain()));
+                answer = export(new ExportQuarkus(getMain()));
             }
             case main -> {
-                return export(new ExportCamelMain(getMain()));
+                answer = export(new ExportCamelMain(getMain()));
             }
             default -> {
                 printer().printErr("Unknown runtime: " + runtime);
@@ -81,6 +87,10 @@ public class Export extends ExportBaseCommand {
             }
         }
 
+        if (answer == 0 && !quiet) {
+            printer().println("Project export successful!");
+        }
+        return answer;
     }
 
     private void doLoadAndInitProfileProperties(File file) throws Exception {
@@ -160,6 +170,7 @@ public class Export extends ExportBaseCommand {
         cmd.excludes = this.excludes;
         cmd.ignoreLoadingError = this.ignoreLoadingError;
         cmd.lazyBean = this.lazyBean;
+        cmd.verbose = this.verbose;
         cmd.applicationProperties = this.applicationProperties;
         // run export
         return cmd.export();
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 db529c97cfe..3d3fcdc5b7d 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
@@ -130,11 +130,11 @@ public abstract class ExportBaseCommand extends 
CamelCommand {
                         description = "Optional location of Maven 
settings-security.xml file to decrypt settings.xml")
     protected String mavenSettingsSecurity;
 
-    @CommandLine.Option(names = { "--maven-central-enabled" },
+    @CommandLine.Option(names = { "--maven-central-enabled" }, defaultValue = 
"true",
                         description = "Whether downloading JARs from Maven 
Central repository is enabled")
     protected boolean mavenCentralEnabled = true;
 
-    @CommandLine.Option(names = { "--maven-apache-snapshot-enabled" },
+    @CommandLine.Option(names = { "--maven-apache-snapshot-enabled" }, 
defaultValue = "true",
                         description = "Whether downloading JARs from ASF Maven 
Snapshot repository is enabled")
     protected boolean mavenApacheSnapshotEnabled = true;
 
@@ -201,7 +201,7 @@ public abstract class ExportBaseCommand extends 
CamelCommand {
             "--directory" }, description = "Directory where the project will 
be exported", defaultValue = ".")
     protected String exportDir;
 
-    @CommandLine.Option(names = { "--clean-dir" },
+    @CommandLine.Option(names = { "--clean-dir" }, defaultValue = "false",
                         description = "If exporting to current directory 
(default) then all existing files are preserved. Enabling this option will 
force cleaning current directory including all sub dirs (use this with care)")
     protected boolean cleanExportDir;
 
@@ -213,7 +213,8 @@ public abstract class ExportBaseCommand extends 
CamelCommand {
                                       + "Use false to turn off and not include 
package name in the Java source files.")
     protected String packageName;
 
-    @CommandLine.Option(names = { "--fresh" }, description = "Make sure we use 
fresh (i.e. non-cached) resources")
+    @CommandLine.Option(names = { "--fresh" }, defaultValue = "false",
+                        description = "Make sure we use fresh (i.e. 
non-cached) resources")
     protected boolean fresh;
 
     @CommandLine.Option(names = { "--download" }, defaultValue = "true",
@@ -229,14 +230,18 @@ public abstract class ExportBaseCommand extends 
CamelCommand {
     protected String[] applicationProperties;
 
     @CommandLine.Option(names = { "--logging" }, defaultValue = "false",
-                        description = "Can be used to turn on logging (logs to 
file in <user home>/.camel directory)")
+                        description = "Can be used to turn on logging to 
console (logs by default to file in <user home>/.camel directory)")
     protected boolean logging;
 
     @CommandLine.Option(names = { "--quiet" }, defaultValue = "false",
                         description = "Will be quiet, only print when error 
occurs")
     protected boolean quiet;
 
-    @CommandLine.Option(names = { "--ignore-loading-error" },
+    @CommandLine.Option(names = { "--verbose" }, defaultValue = "false",
+                        description = "Verbose output of startup activity 
(dependency resolution and downloading")
+    protected boolean verbose;
+
+    @CommandLine.Option(names = { "--ignore-loading-error" }, defaultValue = 
"false",
                         description = "Whether to ignore route loading and 
compilation errors (use this with care!)")
     protected boolean ignoreLoadingError;
 
@@ -245,9 +250,7 @@ public abstract class ExportBaseCommand extends 
CamelCommand {
     protected boolean lazyBean = true;
 
     protected boolean symbolicLink;     // copy source files using symbolic 
link
-
     protected boolean javaLiveReload; // reload java codes in dev
-
     public String pomTemplateName;   // support for specialised pom templates
 
     public ExportBaseCommand(CamelJBangMain main) {
@@ -258,9 +261,10 @@ public abstract class ExportBaseCommand extends 
CamelCommand {
     public Integer doCall() throws Exception {
         // configure logging first
         if (logging) {
-            RuntimeUtil.configureLog(loggingLevel, false, false, false, true, 
null, null);
+            // log to console instead of camel-export.log file
+            RuntimeUtil.configureLog(loggingLevel, false, false, false, false, 
null, null);
         } else {
-            RuntimeUtil.configureLog("off", false, false, false, true, null, 
null);
+            RuntimeUtil.configureLog(loggingLevel, false, false, false, true, 
null, null);
         }
 
         if (!quiet) {
@@ -322,7 +326,7 @@ public abstract class ExportBaseCommand extends 
CamelCommand {
         return null;
     }
 
-    protected Integer runSilently(boolean ignoreLoadingError, boolean 
lazyBean) throws Exception {
+    protected Integer runSilently(boolean ignoreLoadingError, boolean 
lazyBean, boolean verbose) throws Exception {
         Run run = new Run(getMain());
         // need to declare the profile to use for run
         run.dependencies = dependencies;
@@ -341,9 +345,8 @@ public abstract class ExportBaseCommand extends 
CamelCommand {
         run.lazyBean = lazyBean;
         run.property = applicationProperties;
         run.repositories = repositories;
-        run.logging = false;
-        run.loggingLevel = "off";
-
+        run.verbose = verbose;
+        run.logging = logging;
         return run.runExport(ignoreLoadingError);
     }
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java
index c41f3432f84..99d3c22bb76 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java
@@ -63,7 +63,7 @@ class ExportCamelMain extends Export {
         if (fresh || !files.isEmpty() || !settings.exists()) {
             // allow to automatic build
             printer().println("Generating fresh run data");
-            int silent = runSilently(ignoreLoadingError, lazyBean);
+            int silent = runSilently(ignoreLoadingError, lazyBean, verbose);
             if (silent != 0) {
                 return silent;
             }
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java
index 24555910910..69a8fb2dd0b 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java
@@ -68,7 +68,7 @@ class ExportQuarkus extends Export {
         if (fresh || !files.isEmpty() || !settings.exists()) {
             // allow to automatic build
             printer().println("Generating fresh run data");
-            int silent = runSilently(ignoreLoadingError, lazyBean);
+            int silent = runSilently(ignoreLoadingError, lazyBean, verbose);
             if (silent != 0) {
                 return silent;
             }
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java
index 75b1660491f..5b83a73ab47 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java
@@ -66,7 +66,7 @@ class ExportSpringBoot extends Export {
         if (fresh || !files.isEmpty() || !settings.exists()) {
             // allow to automatic build
             printer().println("Generating fresh run data");
-            int silent = runSilently(ignoreLoadingError, lazyBean);
+            int silent = runSilently(ignoreLoadingError, lazyBean, verbose);
             if (silent != 0) {
                 return silent;
             }
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 790fa09cb9b..f9aa74eeae7 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
@@ -195,15 +195,15 @@ public class Run extends CamelCommand {
             description = "Optional location of Maven settings-security.xml 
file to decrypt settings.xml")
     String mavenSettingsSecurity;
 
-    @Option(names = { "--maven-central-enabled" },
+    @Option(names = { "--maven-central-enabled" }, defaultValue = "true",
             description = "Whether downloading JARs from Maven Central 
repository is enabled")
     boolean mavenCentralEnabled = true;
 
-    @Option(names = { "--maven-apache-snapshot-enabled" },
+    @Option(names = { "--maven-apache-snapshot-enabled" }, defaultValue = 
"true",
             description = "Whether downloading JARs from ASF Maven Snapshot 
repository is enabled")
     boolean mavenApacheSnapshotEnabled = true;
 
-    @Option(names = { "--fresh" }, description = "Make sure we use fresh (i.e. 
non-cached) resources")
+    @Option(names = { "--fresh" }, defaultValue = "false", description = "Make 
sure we use fresh (i.e. non-cached) resources")
     boolean fresh;
 
     @Option(names = { "--download" }, defaultValue = "true",
@@ -231,7 +231,7 @@ public class Run extends CamelCommand {
     @Option(names = { "--logging-color" }, defaultValue = "true", description 
= "Use colored logging")
     boolean loggingColor = true;
 
-    @Option(names = { "--logging-json" }, description = "Use JSON logging (ECS 
Layout)")
+    @Option(names = { "--logging-json" }, defaultValue = "false", description 
= "Use JSON logging (ECS Layout)")
     boolean loggingJson;
 
     @Option(names = { "--logging-config-path" }, description = "Path to file 
with custom logging configuration")
@@ -254,7 +254,8 @@ public class Run extends CamelCommand {
             description = "Enables dev mode (live reload when source files are 
updated and saved)")
     boolean dev;
 
-    @Option(names = { "--trace" }, description = "Enables trace logging of the 
routed messages")
+    @Option(names = { "--trace" }, defaultValue = "false",
+            description = "Enables trace logging of the routed messages")
     boolean trace;
 
     @Option(names = { "--properties" },
@@ -269,7 +270,7 @@ public class Run extends CamelCommand {
                                                 + " Multiple names can be 
separated by comma. (all = everything).")
     String stub;
 
-    @Option(names = { "--jfr" },
+    @Option(names = { "--jfr" }, defaultValue = "false",
             description = "Enables Java Flight Recorder saving recording to 
disk on exit")
     boolean jfr;
 
@@ -284,18 +285,19 @@ public class Run extends CamelCommand {
     @Option(names = { "--port" }, description = "Embeds a local HTTP server on 
this port", defaultValue = "8080")
     int port;
 
-    @Option(names = { "--console" }, description = "Developer console at 
/q/dev on local HTTP server (port 8080 by default)")
+    @Option(names = { "--console" }, defaultValue = "false",
+            description = "Developer console at /q/dev on local HTTP server 
(port 8080 by default)")
     boolean console;
 
-    @Option(names = { "--health" },
+    @Option(names = { "--health" }, defaultValue = "false",
             description = "Deprecated: use --observe instead. Health check at 
/q/health on local HTTP server (port 8080 by default)")
     boolean health;
 
-    @Option(names = { "--metrics" },
+    @Option(names = { "--metrics" }, defaultValue = "false",
             description = "Deprecated: use --observe instead. Metrics 
(Micrometer and Prometheus) at /q/metrics on local HTTP server (port 8080 by 
default)")
     boolean metrics;
 
-    @Option(names = { "--observe" },
+    @Option(names = { "--observe" }, defaultValue = "false",
             description = "Enable observability services")
     boolean observe;
 
@@ -309,18 +311,19 @@ public class Run extends CamelCommand {
     @Option(names = { "--code" }, description = "Run the given text or file as 
Java DSL routes")
     String code;
 
-    @Option(names = { "--verbose" }, description = "Verbose output of startup 
activity (dependency resolution and downloading")
+    @Option(names = { "--verbose" }, defaultValue = "false",
+            description = "Verbose output of startup activity (dependency 
resolution and downloading")
     boolean verbose;
 
-    @Option(names = { "--ignore-loading-error" },
+    @Option(names = { "--ignore-loading-error" }, defaultValue = "false",
             description = "Whether to ignore route loading and compilation 
errors (use this with care!)")
     protected boolean ignoreLoadingError;
 
-    @Option(names = { "--lazy-bean" },
+    @Option(names = { "--lazy-bean" }, defaultValue = "false",
             description = "Whether to use lazy bean initialization (can help 
with complex classloading issues")
     protected boolean lazyBean;
 
-    @Option(names = { "--prompt" },
+    @Option(names = { "--prompt" }, defaultValue = "false",
             description = "Allow user to type in required parameters in prompt 
if not present in application")
     boolean prompt;
 
@@ -330,6 +333,9 @@ public class Run extends CamelCommand {
 
     @Override
     public boolean disarrangeLogging() {
+        if (exportRun) {
+            return false;
+        }
         if (RuntimeType.quarkus == runtime) {
             return true;
         } else if (RuntimeType.springBoot == runtime) {
@@ -452,10 +458,12 @@ public class Run extends CamelCommand {
             }
         }
 
-        if (RuntimeType.quarkus == runtime) {
-            return runQuarkus();
-        } else if (RuntimeType.springBoot == runtime) {
-            return runSpringBoot();
+        if (!exportRun) {
+            if (RuntimeType.quarkus == runtime) {
+                return runQuarkus();
+            } else if (RuntimeType.springBoot == runtime) {
+                return runSpringBoot();
+            }
         }
 
         File work = CommandLineHelper.getWorkDir();
@@ -628,7 +636,9 @@ public class Run extends CamelCommand {
         }
 
         if (exportRun) {
-            main.setSilent(true);
+            if (!verbose) {
+                main.setSilent(true);
+            }
             main.addInitialProperty("camel.jbang.export", "true");
             // enable stub in silent mode so we do not use real components
             main.setStubPattern("*");
@@ -1075,9 +1085,16 @@ public class Run extends CamelCommand {
         }
         eq.fresh = this.fresh;
         eq.download = this.download;
-        eq.quiet = true;
-        eq.logging = false;
-        eq.loggingLevel = "off";
+        if (logging) {
+            eq.quiet = false;
+            eq.logging = true;
+            eq.loggingLevel = loggingLevel;
+            eq.verbose = verbose;
+        } else {
+            eq.quiet = true;
+            eq.logging = false;
+            eq.loggingLevel = "off";
+        }
         eq.ignoreLoadingError = this.ignoreLoadingError;
         eq.lazyBean = this.lazyBean;
         eq.applicationProperties = this.property;
@@ -1670,8 +1687,13 @@ public class Run extends CamelCommand {
                 logFile.deleteOnExit();
             }
         } else {
-            RuntimeUtil.configureLog("off", false, false, false, false, null, 
null);
-            writeSettings("loggingLevel", "off");
+            if (exportRun) {
+                RuntimeUtil.configureLog(loggingLevel, false, false, false, 
true, null, null);
+                writeSettings("loggingLevel", loggingLevel);
+            } else {
+                RuntimeUtil.configureLog("off", false, false, false, false, 
null, null);
+                writeSettings("loggingLevel", "off");
+            }
         }
     }
 
@@ -2011,8 +2033,8 @@ public class Run extends CamelCommand {
 
     @Override
     protected Printer printer() {
-        // Export run should be silent
-        if (exportRun) {
+        if (exportRun && (!logging && !verbose)) {
+            // Export run should be silent unless in logging or verbose mode
             if (quietPrinter == null) {
                 quietPrinter = new Printer.QuietPrinter(super.printer());
             }
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/log4j2-export.properties 
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/log4j2-export.properties
index 730ef1eb162..45229e36edd 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/log4j2-export.properties
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/log4j2-export.properties
@@ -17,7 +17,7 @@
 
 appender.file.type = File
 appender.file.name = file
-appender.file.fileName = ${sys:user.home}/.camel/camel-export.log
+appender.file.fileName = 
${sys:user.home}${sys:file.separator}.camel${sys:file.separator}camel-export.log
 appender.file.createOnDemand = true
 appender.file.append = false
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/log4j2-script.properties 
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/log4j2-script.properties
index 55fdfe92d08..fd5b03f612c 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/log4j2-script.properties
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/log4j2-script.properties
@@ -17,7 +17,7 @@
 
 appender.file.type = File
 appender.file.name = file
-appender.file.fileName = ${sys:user.home}/.camel/camel-script.log
+appender.file.fileName = 
${sys:user.home}${sys:file.separator}.camel${sys:file.separator}camel-script.log
 appender.file.createOnDemand = true
 appender.file.append = false
 

Reply via email to