This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new f0ee32dc6136 CAMEL-23146: camel-launcher - Should install embedded
plugins so they appear in --help (#21803)
f0ee32dc6136 is described below
commit f0ee32dc6136b9080213d55876d275cf6d734364
Author: Claus Ibsen <[email protected]>
AuthorDate: Sat Mar 7 16:41:57 2026 +0100
CAMEL-23146: camel-launcher - Should install embedded plugins so they
appear in --help (#21803)
---
.../dsl/jbang/core/commands/CamelJBangMain.java | 286 ++++++++++++---------
dsl/camel-jbang/camel-launcher/pom.xml | 6 +-
.../camel/dsl/jbang/launcher/CamelLauncher.java | 6 +-
.../dsl/jbang/launcher/CamelLauncherMain.java | 38 +++
.../dsl/jbang/launcher/CamelLauncherTest.java | 39 ++-
.../camel-launcher/src/test/resources/bad.yaml | 26 ++
6 files changed, 269 insertions(+), 132 deletions(-)
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
index 8a55de137ba1..93861612e5f4 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
@@ -68,11 +68,17 @@ public class CamelJBangMain implements Callable<Integer> {
private Printer out = new Printer.SystemOutPrinter();
+ private boolean discoverPlugins = true;
+
public static void run(String... args) {
run(new CamelJBangMain(), args);
}
public static void run(CamelJBangMain main, String... args) {
+ main.execute(args);
+ }
+
+ public void execute(String... args) {
// set pid as system property as logging ${sys:pid} needs to be
resolved on windows
try {
long pid = ProcessHandle.current().pid();
@@ -81,128 +87,132 @@ public class CamelJBangMain implements Callable<Integer> {
// ignore
}
- commandLine = new CommandLine(main)
- .addSubcommand("bind", new CommandLine(new Bind(main)))
- .addSubcommand("catalog", new CommandLine(new
CatalogCommand(main))
- .addSubcommand("component", new CommandLine(new
CatalogComponent(main)))
- .addSubcommand("dataformat", new CommandLine(new
CatalogDataFormat(main)))
- .addSubcommand("dev-console", new CommandLine(new
CatalogDevConsole(main)))
- .addSubcommand("kamelet", new CommandLine(new
CatalogKamelet(main)))
- .addSubcommand("transformer", new CommandLine(new
CatalogTransformer(main)))
- .addSubcommand("language", new CommandLine(new
CatalogLanguage(main)))
- .addSubcommand("other", new CommandLine(new
CatalogOther(main))))
- .addSubcommand("cmd", new CommandLine(new CamelAction(main))
- .addSubcommand("browse", new CommandLine(new
CamelBrowseAction(main)))
- .addSubcommand("disable-processor", new
CommandLine(new CamelProcessorDisableAction(main)))
- .addSubcommand("enable-processor", new CommandLine(new
CamelProcessorEnableAction(main)))
- .addSubcommand("gc", new CommandLine(new
CamelGCAction(main)))
- .addSubcommand("load", new CommandLine(new
CamelLoadAction(main)))
- .addSubcommand("logger", new CommandLine(new
LoggerAction(main)))
- .addSubcommand("receive", new CommandLine(new
CamelReceiveAction(main)))
- .addSubcommand("reload", new CommandLine(new
CamelReloadAction(main)))
- .addSubcommand("reset-stats", new CommandLine(new
CamelResetStatsAction(main)))
- .addSubcommand("resume-route", new CommandLine(new
CamelRouteResumeAction(main)))
- .addSubcommand("route-structure", new CommandLine(new
CamelRouteStructureAction(main)))
- .addSubcommand("send", new CommandLine(new
CamelSendAction(main)))
- .addSubcommand("start-group", new CommandLine(new
CamelRouteGroupStartAction(main)))
- .addSubcommand("start-route", new CommandLine(new
CamelRouteStartAction(main)))
- .addSubcommand("stop-group", new CommandLine(new
CamelRouteGroupStopAction(main)))
- .addSubcommand("stop-route", new CommandLine(new
CamelRouteStopAction(main)))
- .addSubcommand("stub", new CommandLine(new
CamelStubAction(main)))
- .addSubcommand("suspend-route", new CommandLine(new
CamelRouteSuspendAction(main)))
- .addSubcommand("thread-dump", new CommandLine(new
CamelThreadDump(main))))
- .addSubcommand("config", new CommandLine(new
ConfigCommand(main))
- .addSubcommand("get", new CommandLine(new
ConfigGet(main)))
- .addSubcommand("list", new CommandLine(new
ConfigList(main)))
- .addSubcommand("set", new CommandLine(new
ConfigSet(main)))
- .addSubcommand("unset", new CommandLine(new
ConfigUnset(main))))
- .addSubcommand("completion", new CommandLine(new
Complete(main)))
- .addSubcommand("doc", new CommandLine(new CatalogDoc(main)))
- .addSubcommand("debug", new CommandLine(new Debug(main)))
- .addSubcommand("dependency", new CommandLine(new
DependencyCommand(main))
- .addSubcommand("copy", new CommandLine(new
DependencyCopy(main)))
- .addSubcommand("list", new CommandLine(new
DependencyList(main)))
- .addSubcommand("runtime", new CommandLine(new
DependencyRuntime(main)))
- .addSubcommand("update", new CommandLine(new
DependencyUpdate(main))))
- .addSubcommand("dirty", new CommandLine(new Dirty(main)))
- .addSubcommand("eval", new CommandLine(new EvalCommand(main))
- .addSubcommand("expression", new CommandLine(new
EvalExpressionCommand(main))))
- .addSubcommand("export", new CommandLine(new Export(main)))
- .addSubcommand("explain", new CommandLine(new Explain(main)))
- .addSubcommand("harden", new CommandLine(new Harden(main)))
- .addSubcommand("get", new CommandLine(new CamelStatus(main))
- .addSubcommand("bean", new CommandLine(new
CamelBeanDump(main)))
- .addSubcommand("blocked", new CommandLine(new
ListBlocked(main)))
- .addSubcommand("circuit-breaker", new CommandLine(new
ListCircuitBreaker(main)))
- .addSubcommand("consumer", new CommandLine(new
ListConsumer(main)))
- .addSubcommand("context", new CommandLine(new
CamelContextStatus(main)))
- .addSubcommand("count", new CommandLine(new
CamelCount(main)))
- .addSubcommand("endpoint", new CommandLine(new
ListEndpoint(main)))
- .addSubcommand("event", new CommandLine(new
ListEvent(main)))
- .addSubcommand("groovy", new CommandLine(new
ListGroovy(main)))
- .addSubcommand("group", new CommandLine(new
CamelRouteGroupStatus(main)))
- .addSubcommand("health", new CommandLine(new
ListHealth(main)))
- .addSubcommand("history", new CommandLine(new
CamelHistoryAction(main)))
- .addSubcommand("inflight", new CommandLine(new
ListInflight(main)))
- .addSubcommand("internal-task", new CommandLine(new
ListInternalTask(main)))
- .addSubcommand("kafka", new CommandLine(new
ListKafka(main)))
- .addSubcommand("metric", new CommandLine(new
ListMetric(main)))
- .addSubcommand("platform-http", new CommandLine(new
ListPlatformHttp(main)))
- .addSubcommand("processor", new CommandLine(new
CamelProcessorStatus(main)))
- .addSubcommand("producer", new CommandLine(new
ListProducer(main)))
- .addSubcommand("properties", new CommandLine(new
ListProperties(main)))
- .addSubcommand("rest", new CommandLine(new
ListRest(main)))
- .addSubcommand("route", new CommandLine(new
CamelRouteStatus(main)))
- .addSubcommand("route-controller", new CommandLine(new
RouteControllerAction(main)))
- .addSubcommand("route-dump", new CommandLine(new
CamelRouteDumpAction(main)))
- .addSubcommand("service", new CommandLine(new
ListService(main)))
- .addSubcommand("source", new CommandLine(new
CamelSourceAction(main)))
- .addSubcommand("startup-recorder", new CommandLine(new
CamelStartupRecorderAction(main)))
- .addSubcommand("transformer", new CommandLine(new
ListTransformer(main)))
- .addSubcommand("variable", new CommandLine(new
ListVariable(main)))
- .addSubcommand("vault", new CommandLine(new
ListVault(main))))
- .addSubcommand("hawtio", new CommandLine(new Hawtio(main)))
- .addSubcommand("infra", new CommandLine(new InfraCommand(main))
- .addSubcommand("get", new CommandLine(new
InfraGet(main)))
- .addSubcommand("list", new CommandLine(new
InfraList(main)))
- .addSubcommand("log", new CommandLine(new
InfraLog(main)))
- .addSubcommand("ps", new CommandLine(new
InfraPs(main)))
- .addSubcommand("run", new CommandLine(new
InfraRun(main)))
- .addSubcommand("stop", new CommandLine(new
InfraStop(main))))
- .addSubcommand("init", new CommandLine(new Init(main)))
- .addSubcommand("jolokia", new CommandLine(new Jolokia(main)))
- .addSubcommand("log", new CommandLine(new
CamelLogAction(main)))
- .addSubcommand("nano", new CommandLine(new Nano(main)))
- .addSubcommand("plugin", new CommandLine(new
PluginCommand(main))
- .addSubcommand("add", new CommandLine(new
PluginAdd(main)))
- .addSubcommand("delete", new CommandLine(new
PluginDelete(main)))
- .addSubcommand("get", new CommandLine(new
PluginGet(main))))
- .addSubcommand("ps", new CommandLine(new ListProcess(main)))
- .addSubcommand("run", new CommandLine(new Run(main)))
- .addSubcommand("sbom", new CommandLine(new
SBOMGenerator(main)))
- .addSubcommand("script", new CommandLine(new Script(main)))
- .addSubcommand("shell", new CommandLine(new Shell(main)))
- .addSubcommand("stop", new CommandLine(new StopProcess(main)))
- .addSubcommand("top", new CommandLine(new CamelTop(main))
- .addSubcommand("context", new CommandLine(new
CamelContextTop(main)))
- .addSubcommand("group", new CommandLine(new
CamelRouteGroupTop(main)))
- .addSubcommand("processor", new CommandLine(new
CamelProcessorTop(main)))
- .addSubcommand("route", new CommandLine(new
CamelRouteTop(main)))
- .addSubcommand("source", new CommandLine(new
CamelSourceTop(main))))
- .addSubcommand("trace", new CommandLine(new
CamelTraceAction(main)))
- .addSubcommand("transform", new CommandLine(new
TransformCommand(main))
- .addSubcommand("message", new CommandLine(new
TransformMessageAction(main)))
- .addSubcommand("route", new CommandLine(new
TransformRoute(main))))
- .addSubcommand("update", new CommandLine(new
UpdateCommand(main))
- .addSubcommand("list", new CommandLine(new
UpdateList(main)))
- .addSubcommand("run", new CommandLine(new
UpdateRun(main))))
- .addSubcommand("version", new CommandLine(new
VersionCommand(main))
- .addSubcommand("get", new CommandLine(new
VersionGet(main)))
- .addSubcommand("list", new CommandLine(new
VersionList(main)))
- .addSubcommand("set", new CommandLine(new
VersionSet(main))))
+ commandLine = new CommandLine(this)
+ .addSubcommand("bind", new CommandLine(new Bind(this)))
+ .addSubcommand("catalog", new CommandLine(new
CatalogCommand(this))
+ .addSubcommand("component", new CommandLine(new
CatalogComponent(this)))
+ .addSubcommand("dataformat", new CommandLine(new
CatalogDataFormat(this)))
+ .addSubcommand("dev-console", new CommandLine(new
CatalogDevConsole(this)))
+ .addSubcommand("kamelet", new CommandLine(new
CatalogKamelet(this)))
+ .addSubcommand("transformer", new CommandLine(new
CatalogTransformer(this)))
+ .addSubcommand("language", new CommandLine(new
CatalogLanguage(this)))
+ .addSubcommand("other", new CommandLine(new
CatalogOther(this))))
+ .addSubcommand("cmd", new CommandLine(new CamelAction(this))
+ .addSubcommand("browse", new CommandLine(new
CamelBrowseAction(this)))
+ .addSubcommand("disable-processor", new
CommandLine(new CamelProcessorDisableAction(this)))
+ .addSubcommand("enable-processor", new CommandLine(new
CamelProcessorEnableAction(this)))
+ .addSubcommand("gc", new CommandLine(new
CamelGCAction(this)))
+ .addSubcommand("load", new CommandLine(new
CamelLoadAction(this)))
+ .addSubcommand("logger", new CommandLine(new
LoggerAction(this)))
+ .addSubcommand("receive", new CommandLine(new
CamelReceiveAction(this)))
+ .addSubcommand("reload", new CommandLine(new
CamelReloadAction(this)))
+ .addSubcommand("reset-stats", new CommandLine(new
CamelResetStatsAction(this)))
+ .addSubcommand("resume-route", new CommandLine(new
CamelRouteResumeAction(this)))
+ .addSubcommand("route-structure", new CommandLine(new
CamelRouteStructureAction(this)))
+ .addSubcommand("send", new CommandLine(new
CamelSendAction(this)))
+ .addSubcommand("start-group", new CommandLine(new
CamelRouteGroupStartAction(this)))
+ .addSubcommand("start-route", new CommandLine(new
CamelRouteStartAction(this)))
+ .addSubcommand("stop-group", new CommandLine(new
CamelRouteGroupStopAction(this)))
+ .addSubcommand("stop-route", new CommandLine(new
CamelRouteStopAction(this)))
+ .addSubcommand("stub", new CommandLine(new
CamelStubAction(this)))
+ .addSubcommand("suspend-route", new CommandLine(new
CamelRouteSuspendAction(this)))
+ .addSubcommand("thread-dump", new CommandLine(new
CamelThreadDump(this))))
+ .addSubcommand("config", new CommandLine(new
ConfigCommand(this))
+ .addSubcommand("get", new CommandLine(new
ConfigGet(this)))
+ .addSubcommand("list", new CommandLine(new
ConfigList(this)))
+ .addSubcommand("set", new CommandLine(new
ConfigSet(this)))
+ .addSubcommand("unset", new CommandLine(new
ConfigUnset(this))))
+ .addSubcommand("completion", new CommandLine(new
Complete(this)))
+ .addSubcommand("doc", new CommandLine(new CatalogDoc(this)))
+ .addSubcommand("debug", new CommandLine(new Debug(this)))
+ .addSubcommand("dependency", new CommandLine(new
DependencyCommand(this))
+ .addSubcommand("copy", new CommandLine(new
DependencyCopy(this)))
+ .addSubcommand("list", new CommandLine(new
DependencyList(this)))
+ .addSubcommand("runtime", new CommandLine(new
DependencyRuntime(this)))
+ .addSubcommand("update", new CommandLine(new
DependencyUpdate(this))))
+ .addSubcommand("dirty", new CommandLine(new Dirty(this)))
+ .addSubcommand("eval", new CommandLine(new EvalCommand(this))
+ .addSubcommand("expression", new CommandLine(new
EvalExpressionCommand(this))))
+ .addSubcommand("export", new CommandLine(new Export(this)))
+ .addSubcommand("explain", new CommandLine(new Explain(this)))
+ .addSubcommand("harden", new CommandLine(new Harden(this)))
+ .addSubcommand("get", new CommandLine(new CamelStatus(this))
+ .addSubcommand("bean", new CommandLine(new
CamelBeanDump(this)))
+ .addSubcommand("blocked", new CommandLine(new
ListBlocked(this)))
+ .addSubcommand("circuit-breaker", new CommandLine(new
ListCircuitBreaker(this)))
+ .addSubcommand("consumer", new CommandLine(new
ListConsumer(this)))
+ .addSubcommand("context", new CommandLine(new
CamelContextStatus(this)))
+ .addSubcommand("count", new CommandLine(new
CamelCount(this)))
+ .addSubcommand("endpoint", new CommandLine(new
ListEndpoint(this)))
+ .addSubcommand("event", new CommandLine(new
ListEvent(this)))
+ .addSubcommand("groovy", new CommandLine(new
ListGroovy(this)))
+ .addSubcommand("group", new CommandLine(new
CamelRouteGroupStatus(this)))
+ .addSubcommand("health", new CommandLine(new
ListHealth(this)))
+ .addSubcommand("history", new CommandLine(new
CamelHistoryAction(this)))
+ .addSubcommand("inflight", new CommandLine(new
ListInflight(this)))
+ .addSubcommand("internal-task", new CommandLine(new
ListInternalTask(this)))
+ .addSubcommand("kafka", new CommandLine(new
ListKafka(this)))
+ .addSubcommand("metric", new CommandLine(new
ListMetric(this)))
+ .addSubcommand("platform-http", new CommandLine(new
ListPlatformHttp(this)))
+ .addSubcommand("processor", new CommandLine(new
CamelProcessorStatus(this)))
+ .addSubcommand("producer", new CommandLine(new
ListProducer(this)))
+ .addSubcommand("properties", new CommandLine(new
ListProperties(this)))
+ .addSubcommand("rest", new CommandLine(new
ListRest(this)))
+ .addSubcommand("route", new CommandLine(new
CamelRouteStatus(this)))
+ .addSubcommand("route-controller", new CommandLine(new
RouteControllerAction(this)))
+ .addSubcommand("route-dump", new CommandLine(new
CamelRouteDumpAction(this)))
+ .addSubcommand("service", new CommandLine(new
ListService(this)))
+ .addSubcommand("source", new CommandLine(new
CamelSourceAction(this)))
+ .addSubcommand("startup-recorder", new CommandLine(new
CamelStartupRecorderAction(this)))
+ .addSubcommand("transformer", new CommandLine(new
ListTransformer(this)))
+ .addSubcommand("variable", new CommandLine(new
ListVariable(this)))
+ .addSubcommand("vault", new CommandLine(new
ListVault(this))))
+ .addSubcommand("hawtio", new CommandLine(new Hawtio(this)))
+ .addSubcommand("infra", new CommandLine(new InfraCommand(this))
+ .addSubcommand("get", new CommandLine(new
InfraGet(this)))
+ .addSubcommand("list", new CommandLine(new
InfraList(this)))
+ .addSubcommand("log", new CommandLine(new
InfraLog(this)))
+ .addSubcommand("ps", new CommandLine(new
InfraPs(this)))
+ .addSubcommand("run", new CommandLine(new
InfraRun(this)))
+ .addSubcommand("stop", new CommandLine(new
InfraStop(this))))
+ .addSubcommand("init", new CommandLine(new Init(this)))
+ .addSubcommand("jolokia", new CommandLine(new Jolokia(this)))
+ .addSubcommand("log", new CommandLine(new
CamelLogAction(this)))
+ .addSubcommand("nano", new CommandLine(new Nano(this)))
+ .addSubcommand("plugin", new CommandLine(new
PluginCommand(this))
+ .addSubcommand("add", new CommandLine(new
PluginAdd(this)))
+ .addSubcommand("delete", new CommandLine(new
PluginDelete(this)))
+ .addSubcommand("get", new CommandLine(new
PluginGet(this))))
+ .addSubcommand("ps", new CommandLine(new ListProcess(this)))
+ .addSubcommand("run", new CommandLine(new Run(this)))
+ .addSubcommand("sbom", new CommandLine(new
SBOMGenerator(this)))
+ .addSubcommand("script", new CommandLine(new Script(this)))
+ .addSubcommand("shell", new CommandLine(new Shell(this)))
+ .addSubcommand("stop", new CommandLine(new StopProcess(this)))
+ .addSubcommand("top", new CommandLine(new CamelTop(this))
+ .addSubcommand("context", new CommandLine(new
CamelContextTop(this)))
+ .addSubcommand("group", new CommandLine(new
CamelRouteGroupTop(this)))
+ .addSubcommand("processor", new CommandLine(new
CamelProcessorTop(this)))
+ .addSubcommand("route", new CommandLine(new
CamelRouteTop(this)))
+ .addSubcommand("source", new CommandLine(new
CamelSourceTop(this))))
+ .addSubcommand("trace", new CommandLine(new
CamelTraceAction(this)))
+ .addSubcommand("transform", new CommandLine(new
TransformCommand(this))
+ .addSubcommand("message", new CommandLine(new
TransformMessageAction(this)))
+ .addSubcommand("route", new CommandLine(new
TransformRoute(this))))
+ .addSubcommand("update", new CommandLine(new
UpdateCommand(this))
+ .addSubcommand("list", new CommandLine(new
UpdateList(this)))
+ .addSubcommand("run", new CommandLine(new
UpdateRun(this))))
+ .addSubcommand("version", new CommandLine(new
VersionCommand(this))
+ .addSubcommand("get", new CommandLine(new
VersionGet(this)))
+ .addSubcommand("list", new CommandLine(new
VersionList(this)))
+ .addSubcommand("set", new CommandLine(new
VersionSet(this))))
.setParameterExceptionHandler(new
MissingPluginParameterExceptionHandler());
- PluginHelper.addPlugins(commandLine, main, args);
+ postAddCommands(commandLine, args);
+
+ if (discoverPlugins) {
+ PluginHelper.addPlugins(commandLine, this, args);
+ }
commandLine.getCommandSpec().versionProvider(() -> {
CamelCatalog catalog = new DefaultCamelCatalog();
@@ -211,8 +221,31 @@ public class CamelJBangMain implements Callable<Integer> {
});
CommandLineHelper.augmentWithUserConfiguration(commandLine);
+ preExecute(commandLine, args);
int exitCode = commandLine.execute(args);
- main.quit(exitCode);
+ postExecute(commandLine, args, exitCode);
+ quit(exitCode);
+ }
+
+ /**
+ * Called after default commands has been added
+ */
+ public void postAddCommands(CommandLine commandLine, String[] args) {
+ // noop
+ }
+
+ /**
+ * Called just before the command line is executed
+ */
+ public void preExecute(CommandLine commandLine, String[] args) {
+ // noop
+ }
+
+ /**
+ * Called just after the command line is executed
+ */
+ public void postExecute(CommandLine commandLine, String[] args, int
exitCode) {
+ // noop
}
/**
@@ -247,6 +280,17 @@ public class CamelJBangMain implements Callable<Integer> {
this.out = out;
}
+ public boolean isDiscoverPlugins() {
+ return discoverPlugins;
+ }
+
+ /**
+ * Should custom plugins be discovered and activated
+ */
+ public void setDiscoverPlugins(boolean discoverPlugins) {
+ this.discoverPlugins = discoverPlugins;
+ }
+
/**
* Uses this printer for writing command output.
*
diff --git a/dsl/camel-jbang/camel-launcher/pom.xml
b/dsl/camel-jbang/camel-launcher/pom.xml
index f98642d79491..dbb49c266866 100644
--- a/dsl/camel-jbang/camel-launcher/pom.xml
+++ b/dsl/camel-jbang/camel-launcher/pom.xml
@@ -66,6 +66,7 @@
<!-- Pre-installed plugins -->
<!-- the edit plugin is not pre-installed -->
<!-- the route-parser plugin is not pre-installed -->
+ <!-- the citrus test plugin cannot be embedded -->
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jbang-plugin-generate</artifactId>
@@ -76,11 +77,6 @@
<artifactId>camel-jbang-plugin-kubernetes</artifactId>
<version>${project.version}</version>
</dependency>
- <dependency>
- <groupId>org.apache.camel</groupId>
- <artifactId>camel-jbang-plugin-test</artifactId>
- <version>${project.version}</version>
- </dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jbang-plugin-validate</artifactId>
diff --git
a/dsl/camel-jbang/camel-launcher/src/main/java/org/apache/camel/dsl/jbang/launcher/CamelLauncher.java
b/dsl/camel-jbang/camel-launcher/src/main/java/org/apache/camel/dsl/jbang/launcher/CamelLauncher.java
index b86976b1a464..b0104447bfd6 100644
---
a/dsl/camel-jbang/camel-launcher/src/main/java/org/apache/camel/dsl/jbang/launcher/CamelLauncher.java
+++
b/dsl/camel-jbang/camel-launcher/src/main/java/org/apache/camel/dsl/jbang/launcher/CamelLauncher.java
@@ -20,8 +20,6 @@ import java.net.URL;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
-import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
-
/**
* Main class for the Camel JBang Fat-Jar Launcher.
* <p>
@@ -45,7 +43,9 @@ public class CamelLauncher {
System.setProperty("camel.launcher.jar", jarPath);
}
- CamelJBangMain.run(args);
+ CamelLauncherMain main = new CamelLauncherMain();
+ main.setDiscoverPlugins(false);
+ main.execute(args);
}
private static String detectJarPath() {
diff --git
a/dsl/camel-jbang/camel-launcher/src/main/java/org/apache/camel/dsl/jbang/launcher/CamelLauncherMain.java
b/dsl/camel-jbang/camel-launcher/src/main/java/org/apache/camel/dsl/jbang/launcher/CamelLauncherMain.java
new file mode 100644
index 000000000000..594c916bfb81
--- /dev/null
+++
b/dsl/camel-jbang/camel-launcher/src/main/java/org/apache/camel/dsl/jbang/launcher/CamelLauncherMain.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.dsl.jbang.launcher;
+
+import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
+import org.apache.camel.dsl.jbang.core.commands.generate.GeneratePlugin;
+import org.apache.camel.dsl.jbang.core.commands.kubernetes.KubernetesPlugin;
+import org.apache.camel.dsl.jbang.core.commands.validate.ValidatePlugin;
+import picocli.CommandLine;
+
+/**
+ * Main for Camel Launcher
+ */
+public class CamelLauncherMain extends CamelJBangMain {
+
+ @Override
+ public void postAddCommands(CommandLine commandLine, String[] args) {
+ // install embedded plugins
+ new GeneratePlugin().customize(commandLine, this);
+ new KubernetesPlugin().customize(commandLine, this);
+ new ValidatePlugin().customize(commandLine, this);
+ }
+
+}
diff --git
a/dsl/camel-jbang/camel-launcher/src/test/java/org/apache/camel/dsl/jbang/launcher/CamelLauncherTest.java
b/dsl/camel-jbang/camel-launcher/src/test/java/org/apache/camel/dsl/jbang/launcher/CamelLauncherTest.java
index 5051f119d7a9..787d53eed606 100644
---
a/dsl/camel-jbang/camel-launcher/src/test/java/org/apache/camel/dsl/jbang/launcher/CamelLauncherTest.java
+++
b/dsl/camel-jbang/camel-launcher/src/test/java/org/apache/camel/dsl/jbang/launcher/CamelLauncherTest.java
@@ -18,9 +18,10 @@ package org.apache.camel.dsl.jbang.launcher;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
+import java.util.concurrent.atomic.AtomicInteger;
-import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
import org.apache.camel.dsl.jbang.core.common.Printer;
+import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -67,20 +68,52 @@ public class CamelLauncherTest {
PrintStream ps = new PrintStream(baos);
// Create a custom main that doesn't exit
- CamelJBangMain main = new CamelJBangMain() {
+ CamelLauncherMain main = new CamelLauncherMain() {
@Override
public void quit(int exitCode) {
// Do nothing to prevent System.exit
}
};
+ main.setDiscoverPlugins(false);
+
// Set a custom printer to capture output
main.setOut(new PrintStreamPrinter(ps));
// Run the version command
- CamelJBangMain.run(main, "version");
+ main.execute("version");
String output = baos.toString();
assertTrue(output.contains("Camel JBang version:"), "Output should
contain version information");
}
+
+ @Test
+ public void testLauncherValidatePlugin() {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ PrintStream ps = new PrintStream(baos);
+
+ // Create a custom main that doesn't exit
+ final AtomicInteger code = new AtomicInteger();
+ CamelLauncherMain main = new CamelLauncherMain() {
+ @Override
+ public void quit(int exitCode) {
+ // Do nothing to prevent System.exit
+ code.set(exitCode);
+ }
+ };
+
+ main.setDiscoverPlugins(false);
+
+ // Set a custom printer to capture output
+ main.setOut(new PrintStreamPrinter(ps));
+
+ // Run the validate command
+ main.execute("validate", "yaml", "src/test/resources/cheese.yaml");
+
+ Assertions.assertEquals(1, code.get());
+
+ String output = baos.toString();
+ Assertions.assertTrue(output.startsWith("Validation error detected
(errors:1)"));
+ }
+
}
diff --git a/dsl/camel-jbang/camel-launcher/src/test/resources/bad.yaml
b/dsl/camel-jbang/camel-launcher/src/test/resources/bad.yaml
new file mode 100644
index 000000000000..5e660e31edd0
--- /dev/null
+++ b/dsl/camel-jbang/camel-launcher/src/test/resources/bad.yaml
@@ -0,0 +1,26 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+- route:
+ from:
+ uri: timer:yaml
+ parameters:
+ period: "1000"
+ steps:
+ - setCheese:
+ simple: Hello Camel from ${routeId}
+ - log: ${body}
\ No newline at end of file