This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch camel-4.10.x
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-4.10.x by this push:
new 23ca92fbbe3 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. (#17685)
23ca92fbbe3 is described below
commit 23ca92fbbe3f7d132f55755632f381ea2d3bfd9f
Author: Claus Ibsen <[email protected]>
AuthorDate: Tue Apr 8 08:01:56 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. (#17685)
* 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 | 77 ++++++++++++----------
.../src/main/resources/log4j2-export.properties | 2 +-
.../src/main/resources/log4j2-script.properties | 2 +-
9 files changed, 91 insertions(+), 55 deletions(-)
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
index c1db7087040..915c53b1a03 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
@@ -3764,6 +3764,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. You can also set
`--logging-level=DEBUG` to output even more details.
+
+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 ae1bdc1aba4..bb82de9b402 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
@@ -127,11 +127,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;
@@ -198,7 +198,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;
@@ -210,7 +210,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",
@@ -226,14 +227,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;
@@ -242,9 +247,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) {
@@ -255,9 +258,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) {
@@ -319,7 +323,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;
@@ -338,9 +342,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 bc6fefce3a2..d1b188cd704 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,13 +285,15 @@ 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" }, description = "Health check at /q/health
on local HTTP server (port 8080 by default)")
+ @Option(names = { "--health" }, defaultValue = "false",
+ description = "Health check at /q/health on local HTTP server
(port 8080 by default)")
boolean health;
- @Option(names = { "--metrics" },
+ @Option(names = { "--metrics" }, defaultValue = "false",
description = "Metrics (Micrometer and Prometheus) at /q/metrics
on local HTTP server (port 8080 by default)")
boolean metrics;
@@ -304,18 +307,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;
@@ -325,6 +329,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) {
@@ -437,7 +444,7 @@ public class Run extends CamelCommand {
if (sourceDir == null && (files != null && files.size() == 1 &&
".".equals(files.get(0)))) {
files.clear();
File[] fs = new File(".").listFiles();
- if (fs != null && fs.length > 0) {
+ if (fs != null) {
for (File f : fs) {
// skip hidden files
if (f.isFile() && !f.isHidden()) {
@@ -447,10 +454,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();
@@ -619,7 +628,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("*");
@@ -700,7 +711,7 @@ public class Run extends CamelCommand {
sjJKubeFiles.add(file);
continue;
} else if (!knownFile(file) && !file.endsWith(".properties")) {
- // non known files to be added on classpath
+ // unknown files to be added on classpath
sjClasspathFiles.add(file);
continue;
}
@@ -961,9 +972,7 @@ public class Run extends CamelCommand {
eq.gav = "org.example.project:" + eq.name + ":1.0-SNAPSHOT";
}
eq.dependencies = this.dependencies;
- if (!this.exportRun) {
- eq.addDependencies("camel:cli-connector");
- }
+ eq.addDependencies("camel:cli-connector");
eq.fresh = this.fresh;
eq.download = this.download;
eq.quiet = true;
@@ -977,7 +986,7 @@ public class Run extends CamelCommand {
// run export
int exit = eq.export();
- if (exit != 0 || this.exportRun) {
+ if (exit != 0) {
return exit;
}
@@ -1035,9 +1044,7 @@ public class Run extends CamelCommand {
eq.gav = "org.example.project:" + eq.name + ":1.0-SNAPSHOT";
}
eq.dependencies.addAll(this.dependencies);
- if (!this.exportRun) {
- eq.addDependencies("camel:cli-connector");
- }
+ eq.addDependencies("camel:cli-connector");
if (this.dev) {
// hot-reload of spring-boot
eq.addDependencies("mvn:org.springframework.boot:spring-boot-devtools");
@@ -1055,7 +1062,7 @@ public class Run extends CamelCommand {
// run export
int exit = eq.export();
- if (exit != 0 || exportRun) {
+ if (exit != 0) {
return exit;
}
@@ -1639,8 +1646,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");
+ }
}
}
@@ -1669,7 +1681,6 @@ public class Run extends CamelCommand {
if ("kamelet.yaml".equals(ext)) {
return true;
}
-
String ext2 = FileUtil.onlyExt(file, true);
if (ext2 != null) {
SourceScheme sourceScheme = SourceScheme.fromUri(file);
@@ -1973,8 +1984,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