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 195ce6b21519 CAMEL-23973: camel export - Add --parent-pom option
195ce6b21519 is described below
commit 195ce6b21519a912fb3a3944b899329d0b21ae61
Author: Claus Ibsen <[email protected]>
AuthorDate: Sun Jul 19 20:44:27 2026 +0200
CAMEL-23973: camel export - Add --parent-pom option
Adds --parent-pom=groupId:artifactId:version option to camel export for
setting
a custom Maven parent POM in the exported project. Supports all three
runtimes
(Spring Boot, Quarkus, Camel Main). For Spring Boot, replaces the default
spring-boot-starter-parent while preserving the spring-boot-dependencies
BOM.
Also configurable via camel.jbang.parentPom in application.properties.
Adds MavenGav.parseStrictGav() for shared strict GAV validation used by both
--gav and --parent-pom across all export commands.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
---
.../jbang/camel-jbang-configuration-metadata.json | 1 +
.../ROOT/pages/camel-jbang-configuration.adoc | 3 +-
.../modules/ROOT/pages/camel-jbang-projects.adoc | 34 ++++++++++++
.../camel-jbang-dependency-copy.adoc | 1 +
.../camel-jbang-dependency-list.adoc | 1 +
.../camel-jbang-dependency-update.adoc | 1 +
.../pages/jbang-commands/camel-jbang-export.adoc | 1 +
.../pages/jbang-commands/camel-jbang-sbom.adoc | 1 +
.../META-INF/camel-jbang-commands-metadata.json | 6 +--
.../camel-jbang-configuration-metadata.json | 1 +
.../camel/dsl/jbang/core/commands/Export.java | 3 ++
.../dsl/jbang/core/commands/ExportBaseCommand.java | 12 +++++
.../dsl/jbang/core/commands/ExportCamelMain.java | 16 +++++-
.../dsl/jbang/core/commands/ExportQuarkus.java | 15 +++++-
.../dsl/jbang/core/commands/ExportSpringBoot.java | 15 +++++-
.../dsl/jbang/core/common/CamelJBangConstants.java | 4 ++
.../resources/templates/main-kubernetes-pom.ftl | 9 ++++
.../src/main/resources/templates/main-pom.ftl | 9 ++++
.../resources/templates/quarkus-kubernetes-pom.ftl | 9 ++++
.../src/main/resources/templates/quarkus-pom.ftl | 9 ++++
.../templates/spring-boot-kubernetes-pom.ftl | 9 ++++
.../main/resources/templates/spring-boot-pom.ftl | 9 ++++
.../camel/dsl/jbang/core/commands/ExportTest.java | 61 ++++++++++++++++++++++
.../org/apache/camel/tooling/maven/MavenGav.java | 17 ++++++
24 files changed, 237 insertions(+), 10 deletions(-)
diff --git
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/jbang/camel-jbang-configuration-metadata.json
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/jbang/camel-jbang-configuration-metadata.json
index 822581e20943..c28faba036ef 100644
---
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/jbang/camel-jbang-configuration-metadata.json
+++
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/jbang/camel-jbang-configuration-metadata.json
@@ -37,6 +37,7 @@
{ "name": "camel.jbang.metrics", "required": false, "description":
"Metrics (Micrometer and Prometheus) at \/observe\/metrics on local HTTP server
(port 8080 by default) when running standalone Camel", "type": "boolean",
"javaType": "boolean", "defaultValue": false, "secret": false, "deprecated":
true },
{ "name": "camel.jbang.openApi", "required": false, "description": "File
name of open-api spec file (JSON or YAML) to generate routes from the
swagger\/openapi API spec file.", "type": "string", "javaType": "String",
"secret": false },
{ "name": "camel.jbang.packageScanJars", "required": false, "description":
"Whether to automatic package scan JARs for custom Spring or Quarkus beans
making them available for Camel CLI", "label": "advanced", "type": "boolean",
"javaType": "boolean", "defaultValue": false, "secret": false },
+ { "name": "camel.jbang.parentPom", "required": false, "description":
"Parent POM coordinate (groupId:artifactId:version) to use in the exported
project", "type": "string", "javaType": "String", "secret": false },
{ "name": "camel.jbang.prompt", "required": false, "description": "Allow
user to type in required parameters in prompt if not present in application",
"label": "advanced", "type": "boolean", "javaType": "boolean", "defaultValue":
false, "secret": false },
{ "name": "camel.jbang.quarkusArtifactId", "required": false,
"description": "artifactId of Quarkus Platform BOM", "label": "quarkus",
"type": "string", "javaType": "String", "secret": false, "deprecated": true },
{ "name": "camel.jbang.quarkusExtensionRegistryBaseUri", "required":
false, "description": "The base URI of Quarkus Extension Registry", "label":
"quarkus", "type": "string", "javaType": "String", "secret": false },
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-configuration.adoc
b/docs/user-manual/modules/ROOT/pages/camel-jbang-configuration.adoc
index f6c9408aa0f6..4a38e58f513a 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-configuration.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-configuration.adoc
@@ -4,7 +4,7 @@ This page covers configuring the Camel CLI — available options,
configuration
// jbang options: START
== Camel CLI configurations
-The camel.jbang supports 48 options, which are listed below.
+The camel.jbang supports 49 options, which are listed below.
[width="100%",cols="2,5,^1,2",options="header"]
|===
@@ -43,6 +43,7 @@ The camel.jbang supports 48 options, which are listed below.
| *camel.jbang.metrics* | Metrics (Micrometer and Prometheus) at
/observe/metrics on local HTTP server (port 8080 by default) when running
standalone Camel | false | boolean
| *camel.jbang.openApi* | File name of open-api spec file (JSON or YAML) to
generate routes from the swagger/openapi API spec file. | | String
| *camel.jbang.packageScanJars* | Whether to automatic package scan JARs for
custom Spring or Quarkus beans making them available for Camel CLI | false |
boolean
+| *camel.jbang.parentPom* | Parent POM coordinate (groupId:artifactId:version)
to use in the exported project | | String
| *camel.jbang.prompt* | Allow user to type in required parameters in prompt
if not present in application | false | boolean
| *camel.jbang.quarkusArtifactId* | artifactId of Quarkus Platform BOM | |
String
| *camel.jbang.quarkusExtensionRegistryBaseUri* | The base URI of Quarkus
Extension Registry | | String
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-projects.adoc
b/docs/user-manual/modules/ROOT/pages/camel-jbang-projects.adoc
index 5d416f666882..26b621316a9b 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-projects.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-projects.adoc
@@ -23,6 +23,40 @@ Notes:
- The `--profile` option is not supported when exporting to Quarkus.
- For Spring Boot, you can override versions with
`--camel-spring-boot-version`.
+=== Exporting with a parent POM
+
+When organizations run many Camel integrations, they typically use a parent
POM to standardize
+plugin versions, required extensions, and common dependencies. Use
`--parent-pom` to set the
+parent POM in the exported project:
+
+[source,bash]
+----
+camel export --runtime=quarkus --gav=com.foo:acme:1.0-SNAPSHOT
--parent-pom=com.ourorg:camel-parent:1.0
+----
+
+This generates the `<parent>` block in the exported `pom.xml`:
+
+[source,xml]
+----
+<parent>
+ <groupId>com.ourorg</groupId>
+ <artifactId>camel-parent</artifactId>
+ <version>1.0</version>
+ <relativePath/>
+</parent>
+----
+
+For Spring Boot, specifying `--parent-pom` replaces the default
`spring-boot-starter-parent`.
+The Spring Boot BOM (`spring-boot-dependencies`) remains in
`<dependencyManagement>`, so version
+management continues to work.
+
+You can also configure this in `application.properties`:
+
+[source,properties]
+----
+camel.jbang.parentPom=com.ourorg:camel-parent:1.0
+----
+
=== Exporting with Java Agent included
NOTE: Only `camel-main` runtime supports Java Agents.
diff --git
a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dependency-copy.adoc
b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dependency-copy.adoc
index 655fa496ce3e..d8c90d2e84ef 100644
---
a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dependency-copy.adoc
+++
b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dependency-copy.adoc
@@ -55,6 +55,7 @@ camel dependency copy [options]
| `--output-directory` | Directory where dependencies should be copied | lib |
String
| `--package-name` | For Java source files should they have the given package
name. By default the package name is computed from the Maven GAV. Use false to
turn off and not include package name in the Java source files. | | String
| `--package-scan-jars` | Whether to automatic package scan JARs for custom
Spring or Quarkus beans making them available for Camel CLI | false | boolean
+| `--parent-pom` | The Maven parent POM group:artifact:version | | String
| `--port` | Embeds a local HTTP server on this port | | int
| `--profile` | Profile to export (dev, test, prod). | | String
| `--prop,--property` | Camel application properties, ex. --property=prop1=foo
| | String
diff --git
a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dependency-list.adoc
b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dependency-list.adoc
index 496d702ec96e..575369f1c32b 100644
---
a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dependency-list.adoc
+++
b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dependency-list.adoc
@@ -54,6 +54,7 @@ camel dependency list [options]
| `--output` | Output format (gav, maven, jbang) | gav | String
| `--package-name` | For Java source files should they have the given package
name. By default the package name is computed from the Maven GAV. Use false to
turn off and not include package name in the Java source files. | | String
| `--package-scan-jars` | Whether to automatic package scan JARs for custom
Spring or Quarkus beans making them available for Camel CLI | false | boolean
+| `--parent-pom` | The Maven parent POM group:artifact:version | | String
| `--port` | Embeds a local HTTP server on this port | | int
| `--profile` | Profile to export (dev, test, prod). | | String
| `--prop,--property` | Camel application properties, ex. --property=prop1=foo
| | String
diff --git
a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dependency-update.adoc
b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dependency-update.adoc
index a5b022885b9e..f5310726df1c 100644
---
a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dependency-update.adoc
+++
b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dependency-update.adoc
@@ -55,6 +55,7 @@ camel dependency update [options]
| `--output` | Output format (gav, maven, jbang) | gav | String
| `--package-name` | For Java source files should they have the given package
name. By default the package name is computed from the Maven GAV. Use false to
turn off and not include package name in the Java source files. | | String
| `--package-scan-jars` | Whether to automatic package scan JARs for custom
Spring or Quarkus beans making them available for Camel CLI | false | boolean
+| `--parent-pom` | The Maven parent POM group:artifact:version | | String
| `--port` | Embeds a local HTTP server on this port | | int
| `--profile` | Profile to export (dev, test, prod). | | String
| `--prop,--property` | Camel application properties, ex. --property=prop1=foo
| | String
diff --git
a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-export.adoc
b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-export.adoc
index e1551ba4d721..b78a1b2349f6 100644
--- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-export.adoc
+++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-export.adoc
@@ -53,6 +53,7 @@ camel export [options]
| `--open-api` | Adds an OpenAPI spec from the given file (json or yaml file)
| | String
| `--package-name` | For Java source files should they have the given package
name. By default the package name is computed from the Maven GAV. Use false to
turn off and not include package name in the Java source files. | | String
| `--package-scan-jars` | Whether to automatic package scan JARs for custom
Spring or Quarkus beans making them available for Camel CLI | false | boolean
+| `--parent-pom` | The Maven parent POM group:artifact:version | | String
| `--port` | Embeds a local HTTP server on this port | | int
| `--profile` | Profile to export (dev, test, prod). | | String
| `--prop,--property` | Camel application properties, ex. --property=prop1=foo
| | String
diff --git
a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-sbom.adoc
b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-sbom.adoc
index 45f5d60a14ec..06036a020a35 100644
--- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-sbom.adoc
+++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-sbom.adoc
@@ -56,6 +56,7 @@ camel sbom [options]
| `--output-name` | Output name of the SBOM file | sbom | String
| `--package-name` | For Java source files should they have the given package
name. By default the package name is computed from the Maven GAV. Use false to
turn off and not include package name in the Java source files. | | String
| `--package-scan-jars` | Whether to automatic package scan JARs for custom
Spring or Quarkus beans making them available for Camel CLI | false | boolean
+| `--parent-pom` | The Maven parent POM group:artifact:version | | String
| `--port` | Embeds a local HTTP server on this port | | int
| `--profile` | Profile to export (dev, test, prod). | | String
| `--prop,--property` | Camel application properties, ex. --property=prop1=foo
| | String
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 42de90d02fe7..7f66b663a036 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
@@ -7,14 +7,14 @@
{ "name": "completion", "fullName": "completion", "description": "Generate
completion script for bash\/zsh", "sourceClass":
"org.apache.camel.dsl.jbang.core.commands.Complete", "options": [ { "names":
"-h,--help", "description": "Display the help and sub-commands", "javaType":
"boolean", "type": "boolean" } ] },
{ "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": "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" } ] },
{ "name": "eval", "fullName": "eval", "description": "Evaluate Camel
expressions and scripts", "sourceClass":
"org.apache.camel.dsl.jbang.core.commands.EvalCommand", "options": [ { "names":
"-h,--help", "description": "Display the help and sub-commands", "javaType":
"boolean", "type": "boolean" } ], "subcommands": [ { "name": "expression",
"fullName": "eval expression", "description": "Evaluates Camel expression",
"sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.EvalEx [...]
{ "name": "explain", "fullName": "explain", "description": "Explain what a
Camel route does using AI\/LLM", "sourceClass":
"org.apache.camel.dsl.jbang.core.commands.Explain", "options": [ { "names":
"--api-key", "description": "API key for authentication. Also reads
ANTHROPIC_API_KEY, OPENAI_API_KEY, or LLM_API_KEY env vars", "javaType":
"java.lang.String", "type": "string" }, { "names": "--api-type", "description":
"API type: 'ollama', 'openai' (OpenAI-compatible), or 'anthropic' (A [...]
- { "name": "export", "fullName": "export", "description": "Export to other
runtimes (Camel Main, Spring Boot, or Quarkus)", "sourceClass":
"org.apache.camel.dsl.jbang.core.commands.Export", "options": [ { "names":
"--build-property", "description": "Maven build properties, ex.
--build-property=prop1=foo", "javaType": "java.util.List", "type": "array" }, {
"names": "--camel-spring-boot-version", "description": "Camel version to use
with Spring Boot", "javaType": "java.lang.String", "ty [...]
+ { "name": "export", "fullName": "export", "description": "Export to other
runtimes (Camel Main, Spring Boot, or Quarkus)", "sourceClass":
"org.apache.camel.dsl.jbang.core.commands.Export", "options": [ { "names":
"--build-property", "description": "Maven build properties, ex.
--build-property=prop1=foo", "javaType": "java.util.List", "type": "array" }, {
"names": "--camel-spring-boot-version", "description": "Camel version to use
with Spring Boot", "javaType": "java.lang.String", "ty [...]
{ "name": "get", "fullName": "get", "description": "Get status of Camel
integrations", "sourceClass":
"org.apache.camel.dsl.jbang.core.commands.process.CamelStatus", "options": [ {
"names": "--watch", "description": "Execute periodically and showing output
fullscreen", "javaType": "boolean", "type": "boolean" }, { "names":
"-h,--help", "description": "Display the help and sub-commands", "javaType":
"boolean", "type": "boolean" } ], "subcommands": [ { "name": "activity",
"fullName": " [...]
{ "name": "harden", "fullName": "harden", "description": "Suggest security
hardening for Camel routes using AI\/LLM", "sourceClass":
"org.apache.camel.dsl.jbang.core.commands.Harden", "options": [ { "names":
"--api-key", "description": "API key for authentication. Also reads
OPENAI_API_KEY or LLM_API_KEY env vars", "javaType": "java.lang.String",
"type": "string" }, { "names": "--api-type", "description": "API type: 'ollama'
or 'openai' (OpenAI-compatible)", "defaultValue": "ollama", [...]
{ "name": "hawtio", "fullName": "hawtio", "description": "Launch Hawtio
web console", "sourceClass":
"org.apache.camel.dsl.jbang.core.commands.process.Hawtio", "options": [ {
"names": "--host", "description": "Hostname to bind the Hawtio web console to",
"defaultValue": "127.0.0.1", "javaType": "java.lang.String", "type": "string"
}, { "names": "--openUrl", "description": "To automatic open Hawtio web console
in the web browser", "defaultValue": "true", "javaType": "boolean", "type":
[...]
@@ -27,7 +27,7 @@
{ "name": "ps", "fullName": "ps", "description": "List running Camel
integrations", "sourceClass":
"org.apache.camel.dsl.jbang.core.commands.process.ListProcess", "options": [ {
"names": "--json", "description": "Output in JSON Format", "javaType":
"boolean", "type": "boolean" }, { "names": "--pid", "description": "List only
pid in the output", "javaType": "boolean", "type": "boolean" }, { "names":
"--remote", "description": "Break down counters into remote\/total pairs",
"javaType": [...]
{ "name": "restart", "fullName": "restart", "description": "Restarts
running Camel integrations (stop + re-launch)", "sourceClass":
"org.apache.camel.dsl.jbang.core.commands.process.RestartProcess", "options": [
{ "names": "-h,--help", "description": "Display the help and sub-commands",
"javaType": "boolean", "type": "boolean" } ] },
{ "name": "run", "fullName": "run", "description": "Run as local Camel
integration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Run",
"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": "sbom", "fullName": "sbom", "description": "Generate a CycloneDX
or SPDX SBOM for a specific project", "sourceClass":
"org.apache.camel.dsl.jbang.core.commands.SBOMGenerator", "options": [ {
"names": "--build-property", "description": "Maven build properties, ex.
--build-property=prop1=foo", "javaType": "java.util.List", "type": "array" }, {
"names": "--camel-spring-boot-version", "description": "Camel version to use
with Spring Boot", "javaType": "java.lang.String", "type" [...]
+ { "name": "sbom", "fullName": "sbom", "description": "Generate a CycloneDX
or SPDX SBOM for a specific project", "sourceClass":
"org.apache.camel.dsl.jbang.core.commands.SBOMGenerator", "options": [ {
"names": "--build-property", "description": "Maven build properties, ex.
--build-property=prop1=foo", "javaType": "java.util.List", "type": "array" }, {
"names": "--camel-spring-boot-version", "description": "Camel version to use
with Spring Boot", "javaType": "java.lang.String", "type" [...]
{ "name": "script", "fullName": "script", "description": "Run Camel
integration as shell script for terminal scripting", "sourceClass":
"org.apache.camel.dsl.jbang.core.commands.Script", "options": [ { "names":
"--logging", "description": "Can be used to turn on logging (logs to file in
<user home>\/.camel directory)", "defaultValue": "false", "javaType":
"boolean", "type": "boolean" }, { "names": "--logging-level", "description":
"Logging level (ERROR, WARN, INFO, DEBUG, TRACE)", "d [...]
{ "name": "shell", "fullName": "shell", "description": "Interactive Camel
CLI shell.", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Shell",
"options": [ { "names": "-h,--help", "description": "Display the help and
sub-commands", "javaType": "boolean", "type": "boolean" } ] },
{ "name": "stop", "fullName": "stop", "description": "Shuts down running
Camel integrations", "sourceClass":
"org.apache.camel.dsl.jbang.core.commands.process.StopProcess", "options": [ {
"names": "--kill", "description": "To force killing the process (SIGKILL)",
"javaType": "boolean", "type": "boolean" }, { "names": "-h,--help",
"description": "Display the help and sub-commands", "javaType": "boolean",
"type": "boolean" } ] },
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/generated/resources/META-INF/camel-jbang-configuration-metadata.json
b/dsl/camel-jbang/camel-jbang-core/src/generated/resources/META-INF/camel-jbang-configuration-metadata.json
index 822581e20943..c28faba036ef 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/generated/resources/META-INF/camel-jbang-configuration-metadata.json
+++
b/dsl/camel-jbang/camel-jbang-core/src/generated/resources/META-INF/camel-jbang-configuration-metadata.json
@@ -37,6 +37,7 @@
{ "name": "camel.jbang.metrics", "required": false, "description":
"Metrics (Micrometer and Prometheus) at \/observe\/metrics on local HTTP server
(port 8080 by default) when running standalone Camel", "type": "boolean",
"javaType": "boolean", "defaultValue": false, "secret": false, "deprecated":
true },
{ "name": "camel.jbang.openApi", "required": false, "description": "File
name of open-api spec file (JSON or YAML) to generate routes from the
swagger\/openapi API spec file.", "type": "string", "javaType": "String",
"secret": false },
{ "name": "camel.jbang.packageScanJars", "required": false, "description":
"Whether to automatic package scan JARs for custom Spring or Quarkus beans
making them available for Camel CLI", "label": "advanced", "type": "boolean",
"javaType": "boolean", "defaultValue": false, "secret": false },
+ { "name": "camel.jbang.parentPom", "required": false, "description":
"Parent POM coordinate (groupId:artifactId:version) to use in the exported
project", "type": "string", "javaType": "String", "secret": false },
{ "name": "camel.jbang.prompt", "required": false, "description": "Allow
user to type in required parameters in prompt if not present in application",
"label": "advanced", "type": "boolean", "javaType": "boolean", "defaultValue":
false, "secret": false },
{ "name": "camel.jbang.quarkusArtifactId", "required": false,
"description": "artifactId of Quarkus Platform BOM", "label": "quarkus",
"type": "string", "javaType": "String", "secret": false, "deprecated": true },
{ "name": "camel.jbang.quarkusExtensionRegistryBaseUri", "required":
false, "description": "The base URI of Quarkus Extension Registry", "label":
"quarkus", "type": "string", "javaType": "String", "secret": false },
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 09912a00615e..f7538ec227ff 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
@@ -51,6 +51,7 @@ import static
org.apache.camel.dsl.jbang.core.common.CamelJBangConstants.MAVEN_S
import static
org.apache.camel.dsl.jbang.core.common.CamelJBangConstants.MAVEN_SETTINGS_SECURITY;
import static
org.apache.camel.dsl.jbang.core.common.CamelJBangConstants.MAVEN_WRAPPER;
import static
org.apache.camel.dsl.jbang.core.common.CamelJBangConstants.OPEN_API;
+import static
org.apache.camel.dsl.jbang.core.common.CamelJBangConstants.PARENT_POM;
import static
org.apache.camel.dsl.jbang.core.common.CamelJBangConstants.SPRING_BOOT_VERSION;
@Command(name = "export",
@@ -190,6 +191,7 @@ public class Export extends ExportBaseCommand {
this.runtime = RuntimeType.fromValue(rt);
}
this.gav = props.getProperty(GAV, this.gav);
+ this.parentPom = props.getProperty(PARENT_POM, this.parentPom);
// allow configuring versions from profile
this.javaVersion = props.getProperty(JAVA_VERSION,
this.javaVersion);
this.camelVersion = props.getProperty(CAMEL_VERSION,
this.camelVersion);
@@ -234,6 +236,7 @@ public class Export extends ExportBaseCommand {
cmd.managementPort = this.managementPort;
cmd.observe = this.observe;
cmd.gav = this.gav;
+ cmd.parentPom = this.parentPom;
cmd.mavenSettings = this.mavenSettings;
cmd.mavenSettingsSecurity = this.mavenSettingsSecurity;
cmd.mavenCentralEnabled = this.mavenCentralEnabled;
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 66393190a527..664a2c603a27 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
@@ -135,6 +135,9 @@ public abstract class ExportBaseCommand extends
CamelCommand {
@CommandLine.Option(names = { "--gav" }, description = "The Maven
group:artifact:version")
protected String gav;
+ @CommandLine.Option(names = { "--parent-pom" }, description = "The Maven
parent POM group:artifact:version")
+ protected String parentPom;
+
@CommandLine.Option(names = { "--exclude" }, description = "Exclude files
by name or pattern")
protected List<String> excludes = new ArrayList<>();
@@ -514,6 +517,15 @@ public abstract class ExportBaseCommand extends
CamelCommand {
/**
* Formats build properties as XML property lines for inclusion in POM
templates.
*/
+ protected void enrichParentPom(Map<String, Object> model) {
+ if (parentPom != null) {
+ MavenGav gav = MavenGav.parseStrictGav(parentPom);
+ model.put("ParentGroupId", gav.getGroupId());
+ model.put("ParentArtifactId", gav.getArtifactId());
+ model.put("ParentVersion", gav.getVersion());
+ }
+ }
+
protected String formatBuildProperties() {
Properties properties = mapBuildProperties();
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 4dcbc8b41f57..db76c9971036 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
@@ -35,6 +35,7 @@ import org.apache.camel.dsl.jbang.core.common.PathUtils;
import org.apache.camel.dsl.jbang.core.common.RuntimeUtil;
import org.apache.camel.dsl.jbang.core.common.TemplateHelper;
import org.apache.camel.dsl.jbang.core.common.VersionHelper;
+import org.apache.camel.tooling.maven.MavenGav;
import org.apache.camel.util.CamelCaseOrderedProperties;
import org.apache.camel.util.ObjectHelper;
@@ -51,11 +52,21 @@ class ExportCamelMain extends Export {
@Override
public Integer export() throws Exception {
- String[] ids = gav.split(":");
- if (ids.length != 3) {
+ try {
+ MavenGav.parseStrictGav(gav);
+ } catch (IllegalArgumentException e) {
printer().printErr("--gav must be in syntax:
groupId:artifactId:version");
return 1;
}
+ if (parentPom != null) {
+ try {
+ MavenGav.parseStrictGav(parentPom);
+ } catch (IllegalArgumentException e) {
+ printer().printErr("--parent-pom must be in syntax:
groupId:artifactId:version");
+ return 1;
+ }
+ }
+ String[] ids = gav.split(":");
// the settings file has information what to export
Path settings =
CommandLineHelper.getWorkDir().resolve(Run.RUN_SETTINGS_FILE);
@@ -217,6 +228,7 @@ class ExportCamelMain extends Export {
model.put("Repositories", buildRepositoryList(repos));
model.put("Dependencies", buildDependencyList(deps));
model.put("JibMavenPluginVersion", jibMavenPluginVersion(settings,
prop));
+ enrichParentPom(model);
// kubernetes/docker properties
enrichKubernetesModel(model, settings, profile);
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 d7f18af8efe3..652843f5ae02 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
@@ -72,11 +72,21 @@ class ExportQuarkus extends Export {
@Override
public Integer export() throws Exception {
- String[] ids = gav.split(":");
- if (ids.length != 3) {
+ try {
+ MavenGav.parseStrictGav(gav);
+ } catch (IllegalArgumentException e) {
printer().printErr("--gav must be in syntax:
groupId:artifactId:version");
return 1;
}
+ if (parentPom != null) {
+ try {
+ MavenGav.parseStrictGav(parentPom);
+ } catch (IllegalArgumentException e) {
+ printer().printErr("--parent-pom must be in syntax:
groupId:artifactId:version");
+ return 1;
+ }
+ }
+ String[] ids = gav.split(":");
exportBaseDir = exportBaseDir != null ? exportBaseDir : Path.of(".");
Path profile = exportBaseDir.resolve("application.properties");
@@ -396,6 +406,7 @@ class ExportQuarkus extends Export {
model.put("Repositories", buildRepositoryList(repos));
model.put("Dependencies", depList);
model.put("JibMavenPluginVersion", jibMavenPluginVersion(settings,
prop));
+ enrichParentPom(model);
String context = TemplateHelper.processTemplate(pomTemplateName,
model);
Files.writeString(pom, context);
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 dd5919f5b1a3..5da20b8589e5 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
@@ -56,11 +56,21 @@ class ExportSpringBoot extends Export {
@Override
public Integer export() throws Exception {
- String[] ids = gav.split(":");
- if (ids.length != 3) {
+ try {
+ MavenGav.parseStrictGav(gav);
+ } catch (IllegalArgumentException e) {
printer().printErr("--gav must be in syntax:
groupId:artifactId:version");
return 1;
}
+ if (parentPom != null) {
+ try {
+ MavenGav.parseStrictGav(parentPom);
+ } catch (IllegalArgumentException e) {
+ printer().printErr("--parent-pom must be in syntax:
groupId:artifactId:version");
+ return 1;
+ }
+ }
+ String[] ids = gav.split(":");
exportBaseDir = exportBaseDir != null ? exportBaseDir : Path.of(".");
Path profile = exportBaseDir.resolve("application.properties");
@@ -228,6 +238,7 @@ class ExportSpringBoot extends Export {
model.put("Repositories", buildRepositoryList(repos));
model.put("Dependencies", depList);
model.put("JibMavenPluginVersion", jibMavenPluginVersion(settings,
prop));
+ enrichParentPom(model);
String context = TemplateHelper.processTemplate(pomTemplateName,
model);
IOHelper.writeText(context, Files.newOutputStream(pom));
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/CamelJBangConstants.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/CamelJBangConstants.java
index de13ed94b4f4..403761e5997f 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/CamelJBangConstants.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/CamelJBangConstants.java
@@ -68,6 +68,10 @@ public final class CamelJBangConstants {
javaType = "String")
public static final String GAV = "camel.jbang.gav";
+ @Metadata(description = "Parent POM coordinate
(groupId:artifactId:version) to use in the exported project",
+ javaType = "String")
+ public static final String PARENT_POM = "camel.jbang.parentPom";
+
@Metadata(description = "Java version",
javaType = "String", enums = "21", defaultValue = "21")
public static final String JAVA_VERSION = "camel.jbang.javaVersion";
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/main-kubernetes-pom.ftl
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/main-kubernetes-pom.ftl
index 784b56ef6a16..6e9171ca79d6 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/main-kubernetes-pom.ftl
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/main-kubernetes-pom.ftl
@@ -21,6 +21,15 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
+[#if ParentGroupId??]
+ <parent>
+ <groupId>[=ParentGroupId]</groupId>
+ <artifactId>[=ParentArtifactId]</artifactId>
+ <version>[=ParentVersion]</version>
+ <relativePath/>
+ </parent>
+
+[/#if]
<groupId>[=GroupId]</groupId>
<artifactId>[=ArtifactId]</artifactId>
<version>[=Version]</version>
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/main-pom.ftl
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/main-pom.ftl
index a5bf0a3966ec..7fcf6c241dbb 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/main-pom.ftl
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/main-pom.ftl
@@ -21,6 +21,15 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
+[#if ParentGroupId??]
+ <parent>
+ <groupId>[=ParentGroupId]</groupId>
+ <artifactId>[=ParentArtifactId]</artifactId>
+ <version>[=ParentVersion]</version>
+ <relativePath/>
+ </parent>
+
+[/#if]
<groupId>[=GroupId]</groupId>
<artifactId>[=ArtifactId]</artifactId>
<version>[=Version]</version>
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/quarkus-kubernetes-pom.ftl
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/quarkus-kubernetes-pom.ftl
index afddc007214a..625455e127f0 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/quarkus-kubernetes-pom.ftl
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/quarkus-kubernetes-pom.ftl
@@ -22,6 +22,15 @@
<modelVersion>4.0.0</modelVersion>
+[#if ParentGroupId??]
+ <parent>
+ <groupId>[=ParentGroupId]</groupId>
+ <artifactId>[=ParentArtifactId]</artifactId>
+ <version>[=ParentVersion]</version>
+ <relativePath/>
+ </parent>
+
+[/#if]
<groupId>[=GroupId]</groupId>
<artifactId>[=ArtifactId]</artifactId>
<version>[=Version]</version>
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/quarkus-pom.ftl
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/quarkus-pom.ftl
index c5f393931c17..61a60b31e9bb 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/quarkus-pom.ftl
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/quarkus-pom.ftl
@@ -21,6 +21,15 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
+[#if ParentGroupId??]
+ <parent>
+ <groupId>[=ParentGroupId]</groupId>
+ <artifactId>[=ParentArtifactId]</artifactId>
+ <version>[=ParentVersion]</version>
+ <relativePath/>
+ </parent>
+
+[/#if]
<groupId>[=GroupId]</groupId>
<artifactId>[=ArtifactId]</artifactId>
<version>[=Version]</version>
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/spring-boot-kubernetes-pom.ftl
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/spring-boot-kubernetes-pom.ftl
index 03b0975f706f..844b4c59b660 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/spring-boot-kubernetes-pom.ftl
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/spring-boot-kubernetes-pom.ftl
@@ -21,12 +21,21 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
+[#if ParentGroupId??]
+ <parent>
+ <groupId>[=ParentGroupId]</groupId>
+ <artifactId>[=ParentArtifactId]</artifactId>
+ <version>[=ParentVersion]</version>
+ <relativePath/>
+ </parent>
+[#else]
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>[=SpringBootVersion]</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
+[/#if]
<groupId>[=GroupId]</groupId>
<artifactId>[=ArtifactId]</artifactId>
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/spring-boot-pom.ftl
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/spring-boot-pom.ftl
index 839893fd627c..6ef05a172a9e 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/spring-boot-pom.ftl
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/spring-boot-pom.ftl
@@ -21,12 +21,21 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
+[#if ParentGroupId??]
+ <parent>
+ <groupId>[=ParentGroupId]</groupId>
+ <artifactId>[=ParentArtifactId]</artifactId>
+ <version>[=ParentVersion]</version>
+ <relativePath/>
+ </parent>
+[#else]
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>[=SpringBootVersion]</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
+[/#if]
<groupId>[=GroupId]</groupId>
<artifactId>[=ArtifactId]</artifactId>
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportTest.java
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportTest.java
index ca623d5cdbab..3f943ff9eae0 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportTest.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportTest.java
@@ -987,6 +987,67 @@ class ExportTest {
}
}
+ @ParameterizedTest
+ @MethodSource("runtimeProvider")
+ public void shouldExportWithParentPom(RuntimeType rt) throws Exception {
+ LOG.info("shouldExportWithParentPom {}", rt);
+ Export command = new Export(new CamelJBangMain());
+ List<String> cmdArgs = new ArrayList<>(
+ List.of("--gav=examples:route:1.0.0", "--dir=" + workingDir,
+ "--runtime=%s".formatted(rt.runtime()),
+ "--parent-pom=com.ourorg:camel-parent:1.0"));
+ if (rt == RuntimeType.springBoot) {
+ cmdArgs.add("--camel-version=" + RELEASED_CAMEL_VERSION);
+ }
+ cmdArgs.add("target/test-classes/route.yaml");
+ CommandLine.populateCommand(command, cmdArgs.toArray(String[]::new));
+ int exit = command.doCall();
+
+ Assertions.assertEquals(0, exit);
+ Model model = readMavenModel();
+ Assertions.assertEquals("examples", model.getGroupId());
+ Assertions.assertEquals("route", model.getArtifactId());
+ Assertions.assertEquals("1.0.0", model.getVersion());
+
+ // verify parent POM is set
+ Assertions.assertNotNull(model.getParent(), "Parent POM should be
set");
+ Assertions.assertEquals("com.ourorg", model.getParent().getGroupId());
+ Assertions.assertEquals("camel-parent",
model.getParent().getArtifactId());
+ Assertions.assertEquals("1.0", model.getParent().getVersion());
+
+ if (rt == RuntimeType.springBoot) {
+ // Spring Boot BOM should still be in dependencyManagement
+ assertThat(model.getDependencyManagement().getDependencies())
+ .as("Spring Boot BOM must be in dependencyManagement when
using custom parent")
+ .anySatisfy(dep -> {
+
assertThat(dep.getGroupId()).isEqualTo("org.springframework.boot");
+
assertThat(dep.getArtifactId()).isEqualTo("spring-boot-dependencies");
+ });
+ }
+ }
+
+ @ParameterizedTest
+ @MethodSource("runtimeProvider")
+ public void shouldExportWithoutParentPom(RuntimeType rt) throws Exception {
+ LOG.info("shouldExportWithoutParentPom {}", rt);
+ Export command = createCommand(rt, new String[] {
"classpath:route.yaml" },
+ "--gav=examples:route:1.0.0", "--dir=" + workingDir,
"--quiet");
+ int exit = command.doCall();
+
+ Assertions.assertEquals(0, exit);
+ Model model = readMavenModel();
+
+ if (rt == RuntimeType.springBoot) {
+ // default Spring Boot parent should be used
+ Assertions.assertNotNull(model.getParent(), "Spring Boot parent
should be set by default");
+ Assertions.assertEquals("org.springframework.boot",
model.getParent().getGroupId());
+ Assertions.assertEquals("spring-boot-starter-parent",
model.getParent().getArtifactId());
+ } else {
+ // Quarkus and Main should have no parent by default
+ Assertions.assertNull(model.getParent(), "No parent POM should be
set by default for " + rt);
+ }
+ }
+
@ParameterizedTest
@MethodSource("runtimeProvider")
public void shouldContainJibProfile(RuntimeType rt) throws Exception {
diff --git
a/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenGav.java
b/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenGav.java
index ea0bf22673ca..cb9867b842ed 100644
---
a/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenGav.java
+++
b/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenGav.java
@@ -42,6 +42,23 @@ public final class MavenGav {
return parseGav(gav, null);
}
+ /**
+ * Parses a strict {@code groupId:artifactId:version} GAV string. Unlike
{@link #parseGav(String)}, this method
+ * requires exactly three colon-separated parts and throws if the input
does not match.
+ *
+ * @param gav the GAV string in {@code
groupId:artifactId:version} format
+ * @return a new {@link MavenGav}
+ * @throws IllegalArgumentException if the input does not contain exactly
three colon-separated parts
+ */
+ public static MavenGav parseStrictGav(String gav) {
+ String[] parts = gav.split(":");
+ if (parts.length != 3) {
+ throw new IllegalArgumentException(
+ "Expected groupId:artifactId:version, got: " + gav);
+ }
+ return fromCoordinates(parts[0], parts[1], parts[2], null, null);
+ }
+
public static MavenGav fromCoordinates(
String groupId, String artifactId, String version, String
packaging,
String classifier) {