This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch fix/CAMEL-23658-camel-dev-command in repository https://gitbox.apache.org/repos/asf/camel.git
commit 9206bdff7f53eb3efd698f12785b56d33d5399ad Author: Claus Ibsen <[email protected]> AuthorDate: Mon Jun 1 21:50:32 2026 +0200 CAMEL-23658: camel-jbang - Add camel dev as alias for camel run --dev Co-Authored-By: Claude <[email protected]> Signed-off-by: Claus Ibsen <[email protected]> --- .../pages/jbang-commands/camel-jbang-commands.adoc | 1 + .../ROOT/pages/jbang-commands/camel-jbang-dev.adoc | 86 +++++++++++++++++++++ .../META-INF/camel-jbang-commands-metadata.json | 1 + .../dsl/jbang/core/commands/CamelJBangMain.java | 1 + .../apache/camel/dsl/jbang/core/commands/Dev.java | 43 +++++++++++ .../camel/dsl/jbang/core/commands/DevTest.java | 88 ++++++++++++++++++++++ 6 files changed, 220 insertions(+) diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-commands.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-commands.adoc index 007bc78d9982..c5ec871a2084 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-commands.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-commands.adoc @@ -19,6 +19,7 @@ TIP: You can also use `camel --help` or `camel <command> --help` to see availabl | xref:jbang-commands/camel-jbang-config.adoc[camel config] | Get and set user configuration values | xref:jbang-commands/camel-jbang-debug.adoc[camel debug] | Debug local Camel integration | xref:jbang-commands/camel-jbang-dependency.adoc[camel dependency] | Displays all Camel dependencies required to run +| xref:jbang-commands/camel-jbang-dev.adoc[camel dev] | Run in dev mode with live reload | xref:jbang-commands/camel-jbang-dirty.adoc[camel dirty] | Check if there are dirty files from previous Camel runs that did not terminate gracefully | xref:jbang-commands/camel-jbang-doc.adoc[camel doc] | Shows documentation for kamelet, component, and other Camel resources | xref:jbang-commands/camel-jbang-doctor.adoc[camel doctor] | Checks the environment and reports potential issues diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dev.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dev.adoc new file mode 100644 index 000000000000..b5fc0208c2b1 --- /dev/null +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dev.adoc @@ -0,0 +1,86 @@ + +// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE += camel dev + +Run in dev mode with live reload + + +== Usage + +[source,bash] +---- +camel dev [options] +---- + + + +== Options + +[cols="2,5,1,2",options="header"] +|=== +| Option | Description | Default | Type +| `--background` | Run in the background | false | boolean +| `--background-wait` | To wait for run in background to startup successfully, before returning | true | boolean +| `--backlog-trace` | Enables backlog tracing of the routed messages | false | boolean +| `--camel-spring-boot-version` | To run using a different Camel Spring Boot version than the default version. | | String +| `--camel-version` | To run using a different Camel version than the default version. | | String +| `--code` | Run the given text or file as Java DSL routes | | String +| `--console` | Developer console at /q/dev on local HTTP server (port 8080 by default) | false | boolean +| `--dep,--dependency` | Add additional dependencies | | List +| `--download` | Whether to allow automatic downloading JAR dependencies (over the internet) | true | boolean +| `--empty` | Run an empty Camel without loading source files | false | boolean +| `--example` | Run an example by name, or list available examples when no name is given. | | String +| `--exclude` | Exclude files by name or pattern | | List +| `--fresh` | Make sure we use fresh (i.e. non-cached) resources | false | boolean +| `--gav` | The Maven group:artifact:version (used during exporting) | | String +| `--health` _(deprecated)_ | Deprecated: use --observe instead. Health check at /q/health on local HTTP server (port 8080 by default) | false | boolean +| `--ignore-loading-error` | Whether to ignore route loading and compilation errors (use this with care!) | false | boolean +| `--java-version,--java` | Java version (21, 25) | 21 | String +| `--jfr` | Enables Java Flight Recorder saving recording to disk on exit | false | boolean +| `--jfr-profile` | Java Flight Recorder profile to use (such as default or profile) | | String +| `--jvm-debug` | To enable JVM remote debugging on port 4004 by default. The supported values are true to enable the remote debugging, false to disable the remote debugging or a number to use a custom port | | int +| `--kamelets-version` | Apache Camel Kamelets version | | String +| `--lazy-bean` | Whether to use lazy bean initialization (can help with complex classloading issues) | false | boolean +| `--local-kamelet-dir` | Local directory (or github link) for loading Kamelets (takes precedence). Multiple directories can be specified separated by comma. | | String +| `--logging` | Can be used to turn off logging | true | boolean +| `--logging-category` | Used for individual logging levels (ex: org.apache.kafka=DEBUG) | | List +| `--logging-color` | Use colored logging. Default is auto-detected based on NO_COLOR, CI, FORCE_COLOR environment variables and terminal capabilities | | boolean +| `--logging-config-path` | Path to file with custom logging configuration | | String +| `--logging-json` | Use JSON logging (ECS Layout) | false | boolean +| `--logging-level` | Logging level (ERROR, WARN, INFO, DEBUG, TRACE) | info | String +| `--management-port` | To use a dedicated port for HTTP management (use 0 to dynamic assign a free random port number) | | int +| `--maven-apache-snapshot-enabled` | Whether downloading JARs from ASF Maven Snapshot repository is enabled | true | boolean +| `--maven-central-enabled` | Whether downloading JARs from Maven Central repository is enabled | true | boolean +| `--maven-settings` | Optional location of Maven settings.xml file to configure servers, repositories, mirrors and proxies. If set to false, not even the default ~/.m2/settings.xml will be used. | | String +| `--maven-settings-security` | Optional location of Maven settings-security.xml file to decrypt settings.xml | | String +| `--max-idle-seconds` | For how long time in seconds Camel can be idle before stopping | 0 | int +| `--max-messages` | Max number of messages to process before stopping | 0 | int +| `--max-seconds` | Max seconds to run before stopping | 0 | int +| `--metrics` _(deprecated)_ | Deprecated: use --observe instead. Metrics (Micrometer and Prometheus) at /q/metrics on local HTTP server (port 8080 by default) | false | boolean +| `--modeline` | Whether to support JBang style //DEPS to specify additional dependencies | true | boolean +| `--name` | The name of the Camel application | CamelJBang | String +| `--observe` | Enable observability services | false | boolean +| `--open-api` | Adds an OpenAPI spec from the given file (json or yaml file) | | String +| `--package-scan-jars` | Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel JBang | false | boolean +| `--port` | Embeds a local HTTP server on this port (port 8080 by default; use 0 to dynamic assign a free random port number) | | int +| `--profile` | Profile to run (dev, test, prod). | dev | String +| `--prompt` | Allow user to type in required parameters in prompt if not present in application | false | boolean +| `--prop,--property` | Additional properties (override existing) | | String +| `--properties` | comma separated list of properties file (ex. /path/to/file.properties,/path/to/other.properties | | String +| `--quarkus-artifact-id` _(deprecated)_ | Deprecated. This value is not used anymore. It is kept only for backwards compatibility and will be removed in Camel 5.x. Camel commands may use either 'quarkus-bom' or 'quarkus-camel-bom' artifactIds depending on the context. | quarkus-bom | String +| `--quarkus-ext-registry` | The base URI of Quarkus Extension Registry. The default is {@value RuntimeType#QUARKUS_EXTENSION_REGISTRY_BASE_URL} unless camel.jbang.quarkus.platform.url system property is set (the /client/platforms suffix is removed if present). | | String +| `--quarkus-group-id` | groupId of Quarkus Platform BOM; honored only if --quarkus-version is set | io.quarkus.platform | String +| `--quarkus-version` | version of Quarkus Platform BOM; the default value is looked up in Quarkus Extension Registry | | String +| `--reload,--dev` | Enables dev mode (live reload when source files are updated and saved) | | boolean +| `--repo,--repos` | Additional maven repositories for download on-demand (Use commas to separate multiple repositories) | | String +| `--runtime` | Runtime (camel-main, spring-boot, quarkus) | camel-main | RuntimeType +| `--skip-plugins` | Skip resolving plugin dependencies | false | boolean +| `--source-dir` | Source directory for dynamically loading Camel file(s) to run. When using this, then files cannot be specified at the same time. | | String +| `--spring-boot-version` | Spring Boot version | RuntimeType.SPRING_BOOT_VERSION | String +| `--stub` | Stubs all the matching endpoint uri with the given component name or pattern. Multiple names can be separated by comma. (all = stub all endpoints). | | String +| `--trace` | Enables trace logging of the routed messages | false | boolean +| `--verbose` | Verbose output of startup activity (dependency resolution and downloading | false | boolean +| `-h,--help` | Display the help and sub-commands | | boolean +|=== + + diff --git a/dsl/camel-jbang/camel-jbang-core/src/generated/resources/META-INF/camel-jbang-commands-metadata.json b/dsl/camel-jbang/camel-jbang-core/src/generated/resources/META-INF/camel-jbang-commands-metadata.json index c03c11cf0cbf..fd70451710c6 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/generated/resources/META-INF/camel-jbang-commands-metadata.json +++ b/dsl/camel-jbang/camel-jbang-core/src/generated/resources/META-INF/camel-jbang-commands-metadata.json @@ -8,6 +8,7 @@ { "name": "config", "fullName": "config", "description": "Get and set user configuration values", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.config.ConfigCommand", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "get", "fullName": "config get", "description": "Display user configuration value", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.config. [...] { "name": "debug", "fullName": "debug", "description": "Debug local Camel integration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Debug", "options": [ { "names": "--ago", "description": "Use ago instead of yyyy-MM-dd HH:mm:ss in timestamp.", "javaType": "boolean", "type": "boolean" }, { "names": "--background", "description": "Run in the background", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--background-wait", "description": "To [...] { "name": "dependency", "fullName": "dependency", "description": "Displays all Camel dependencies required to run", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.DependencyCommand", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "copy", "fullName": "dependency copy", "description": "Copies all Camel dependencies required to run to a specific directory", "sourc [...] + { "name": "dev", "fullName": "dev", "description": "Run in dev mode with live reload", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Dev", "options": [ { "names": "--background", "description": "Run in the background", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--background-wait", "description": "To wait for run in background to startup successfully, before returning", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, [...] { "name": "dirty", "fullName": "dirty", "description": "Check if there are dirty files from previous Camel runs that did not terminate gracefully", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.Dirty", "options": [ { "names": "--clean", "description": "Clean dirty files which are no longer in use", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", " [...] { "name": "doc", "fullName": "doc", "description": "Shows documentation for kamelet, component, and other Camel resources", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogDoc", "options": [ { "names": "--camel-version", "description": "To use a different Camel version than the default version", "javaType": "java.lang.String", "type": "string" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet [...] { "name": "doctor", "fullName": "doctor", "description": "Checks the environment and reports potential issues", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Doctor", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, 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 e5102ba30f99..8fba5dba0f31 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 @@ -134,6 +134,7 @@ public class CamelJBangMain implements Callable<Integer> { .addSubcommand("completion", new CommandLine(new Complete(this))) .addSubcommand("doc", new CommandLine(new CatalogDoc(this))) .addSubcommand("debug", new CommandLine(new Debug(this))) + .addSubcommand("dev", new CommandLine(new Dev(this))) .addSubcommand("dependency", new CommandLine(new DependencyCommand(this)) .addSubcommand("copy", new CommandLine(new DependencyCopy(this))) .addSubcommand("list", new CommandLine(new DependencyList(this))) diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Dev.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Dev.java new file mode 100644 index 000000000000..23c8aa932cdc --- /dev/null +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Dev.java @@ -0,0 +1,43 @@ +/* + * 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.core.commands; + +import picocli.CommandLine.Command; + +@Command(name = "dev", description = "Run in dev mode with live reload", sortOptions = false, showDefaultValues = true, + footer = { + "%nExamples:", + " camel dev", + " camel dev hello.yaml", + " camel dev --port=8080" }) +public class Dev extends Run { + + public Dev(CamelJBangMain main) { + super(main); + } + + @Override + public Integer doCall() throws Exception { + // always enable dev mode + dev = true; + // default to source-dir=. when no files are specified + if (files.isEmpty() && sourceDir == null) { + sourceDir = "."; + } + return super.doCall(); + } +} diff --git a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DevTest.java b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DevTest.java new file mode 100644 index 000000000000..146ed6fb24a1 --- /dev/null +++ b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DevTest.java @@ -0,0 +1,88 @@ +/* + * 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.core.commands; + +import org.junit.jupiter.api.Test; +import picocli.CommandLine; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class DevTest extends CamelCommandBaseTestSupport { + + @Test + public void shouldDefaultToDevModeWithSourceDir() throws Exception { + Dev command = createDev(); + CommandLine.populateCommand(command); + + // before doCall, dev is not yet set + assertFalse(command.dev); + assertNull(command.sourceDir); + assertTrue(command.files.isEmpty()); + + // simulate what doCall does before delegating to super + command.dev = true; + if (command.files.isEmpty() && command.sourceDir == null) { + command.sourceDir = "."; + } + + assertTrue(command.dev); + assertEquals(".", command.sourceDir); + } + + @Test + public void shouldNotOverrideSourceDirWhenFilesSpecified() throws Exception { + Dev command = createDev(); + CommandLine.populateCommand(command, "hello.yaml"); + + assertFalse(command.files.isEmpty()); + + // simulate what doCall does before delegating to super + command.dev = true; + if (command.files.isEmpty() && command.sourceDir == null) { + command.sourceDir = "."; + } + + assertTrue(command.dev); + // sourceDir should remain null since files were specified + assertNull(command.sourceDir); + } + + @Test + public void shouldRespectExplicitSourceDir() throws Exception { + Dev command = createDev(); + CommandLine.populateCommand(command, "--source-dir=src/main/routes"); + + assertTrue(command.files.isEmpty()); + + // simulate what doCall does before delegating to super + command.dev = true; + if (command.files.isEmpty() && command.sourceDir == null) { + command.sourceDir = "."; + } + + assertTrue(command.dev); + // explicit source-dir should not be overridden + assertEquals("src/main/routes", command.sourceDir); + } + + private Dev createDev() { + return new Dev(new CamelJBangMain().withPrinter(printer)); + } +}
