Claus Ibsen created CAMEL-26912:
-----------------------------------

             Summary: camel-jbang - camel export: concurrent exports corrupt 
each other, the export directory is wiped, application.properties is mangled, 
and the Kamelets catalog is downloaded every time
                 Key: CAMEL-26912
                 URL: https://issues.apache.org/jira/browse/CAMEL-26912
             Project: Camel
          Issue Type: Bug
          Components: camel-jbang
            Reporter: Claus Ibsen
             Fix For: 4.24.0


Found by an analysis of the Camel CLI on the night of 2026-11-12, with the 
unpacked 4.24.0-SNAPSHOT camel-launcher on macOS. *(exp)* means reproduced by 
experiment, *(read)* means traced in the code. Paths are relative to 
{{dsl/camel-jbang/}}, and line numbers are from main at that time. Dependency 
resolution of camel run is covered separately by CAMEL-26901.

h3. 1. Concurrent exports or runs in one folder corrupt each other and report 
success (exp, high)

{{ExportRequest}} uses the shared {{.camel-jbang/work}} directory, and 
{{RunPipeline.prepareWorkDir}} (RunPipeline.java around line 272) deletes it. 
Four parallel exports of different routes from one folder: 2 failed with exit 
66, and 2 printed "successful", but one exported project held another export's 
route, the wrong artifactId and two main classes.

This also hits an AI agent or a script that exports while a {{camel run}} is 
going on in the same folder. Suggested fix: a work directory per export/run (or 
a lock).

h3. 2. Exporting into a directory other than the current one deletes its 
contents with no prompt (exp)

The export directory is cleaned before the copy 
({{ExportHelper.cleanExportDir}}, called from 
CamelMainExporter/SpringBootExporter/QuarkusExporter around lines 202-216), so 
files the user put there are gone ({{TODO.txt}} and {{docs/notes.txt}} in the 
test), and a failed export leaves nothing.

This is deliberate since CAMEL-21104, but only {{--clean-dir}} asks for 
confirmation. Suggestion: refuse (or ask) when the directory holds files that 
are not from a previous export, or only delete after the export succeeded.

h3. 3. application.properties is corrupted on export (exp)

{{Properties}} unescapes on load, then {{Exporter.applicationPropertyLine}} 
(Exporter.java around line 988) writes {{key=value}} raw:

{noformat}
path=C:\\temp\\new          -> becomes C:<TAB>emp<NEWLINE>ew
regex=^\\d+$                 -> becomes ^d+$
my.key\ with\ space=1        -> becomes the key "my.key" with value "with 
space=1"
{noformat}

h3. 4. UTF-8 application.properties is double-encoded (exp)

{{RuntimeUtil.loadProperties}} (camel-jbang-core {{common/RuntimeUtil.java}} 
around line 280) loads with {{Properties.load(InputStream)}}, which is 
ISO-8859-1, and the result is written as UTF-8: {{æøå}} becomes {{æøå}}.

h3. 5. Two files with the same name in different directories collapse into one 
(exp)

{{Exporter.java}} around line 703 copies with 
{{targetDir.resolve(source.getFileName())}} (and Quarkus uses {{stripPath}}): 
exporting {{x/route.camel.yaml}} and {{y/route.camel.yaml}} gives one file, and 
one route is silently lost. It should fail, or keep the relative path.

h3. 6. Local lib JARs break the export (exp)

The {{systemPath}} in the pom is built from the artifactId and version 
({{main-pom.ftl}} line 111), but the JAR is copied with its own file name, so 
{{mvn}} fails on the exported project. Exporting a directory that contains a 
JAR fails with exit 66, and the JAR is also copied into {{src/main/resources}}.

h3. 7. Every export downloads the Kamelets catalog, even with no Kamelets (exp)

{{Exporter.java}} around line 290 always calls 
{{KameletCatalogHelper.loadKamelets}}, which uses its own downloader that 
ignores {{--maven-settings}} and mirrors. With a fresh home an export of a 
plain route takes 15.2s vs 1.5s warm: 38 MB of the 53 MB downloaded is the 
camel-kamelets-catalog tree (fabric8, vert.x, ...). Offline, the export of a 
route with no Kamelets fails (read). Only load it when a source refers to a 
Kamelet.

h3. 8. Run directories are left behind (read)

The {{.camel-jbang-run/<millis>}} directories of the Spring Boot, Quarkus and 
main runners are only removed by a shutdown hook, so a crash leaves the project 
plus its {{target/}} forever. {{Debug.java}} around line 440 deletes the whole 
{{.camel-jbang-run}}, including the directories of other live runs.

h3. 9. Windows (read)

* {{Exporter.getScheme}} treats {{C:}} as a scheme, so absolute TLS, classpath 
and JKube files are dropped.
* {{MavenCommand}} falls back to {{mvn}} and not {{mvn.cmd}}.

h3. Came out clean

Warm export speed is 1.5s (main) to 1.9s (Spring Boot, Quarkus), one silent run 
per export; the Quarkus registry call has a 20s timeout and a daily cache; 
{{mvn}} runs with {{inheritIO}} and its exit code is checked.

h3. Suggested order

# 1 and 2 (data loss)
# 3, 4, 5 (silent corruption of the exported project)
# 7 (speed and offline)
# the rest

_Claude Code on behalf of Claus Ibsen (davsclaus)_



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to