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