Claus Ibsen created CAMEL-25833:
-----------------------------------
Summary: camel-jbang - camel run --dev: a dependency added to
camel.jbang.dependencies while the app runs is not downloaded
Key: CAMEL-25833
URL: https://issues.apache.org/jira/browse/CAMEL-25833
Project: Camel
Issue Type: Improvement
Components: camel-jbang
Reporter: Claus Ibsen
Fix For: 4.24.0
{{camel run}} reads {{camel.jbang.dependencies}} from application.properties
before the app starts, and hands the list to KameletMain. KameletMain downloads
it once, when the app starts ({{CommandLineDependencyDownloader.doInit}}). In
dev mode, a dependency that is added while the app runs is not downloaded. Only
a restart picks it up.
With CAMEL-25767 (PR #28123), a reload creates the beans that are new in
{{camel.beans.*}}. A bean whose class comes from such a dependency then fails.
Reproduced with {{camel run --source-dir=. --dev}} and the camel launcher built
from that PR, by appending to application.properties while the app runs:
{noformat}
camel.jbang.dependencies = com.github.javafaker:javafaker:1.0.2
camel.beans.faker = #class:com.github.javafaker.Faker
{noformat}
{noformat}
INFO RouteWatcherReloadStrategy : Reloading properties:
file:application.properties. (Only Camel routes and components can be updated
with changes)
WARN FileWatcherResourceReloadStrategy : Error reloading routes from file:
application.properties due to: com.github.javafaker.Faker. This exception is
ignored.
java.lang.ClassNotFoundException: com.github.javafaker.Faker
at
org.apache.camel.impl.engine.DefaultClassResolver.resolveMandatoryClass(DefaultClassResolver.java:136)
at
org.apache.camel.main.BaseMainSupport.createBeanViaInferredBuilder(BaseMainSupport.java:2772)
at
org.apache.camel.main.BaseMainSupport.bindBeansToRegistry(BaseMainSupport.java:2867)
at
org.apache.camel.main.BaseMainSupport.bindReloadedBeans(BaseMainSupport.java:2831)
...
{noformat}
With the same two lines in application.properties before the app starts,
javafaker is downloaded and the bean is bound. Classes that camel-jbang knows
(such as {{org.apache.activemq.artemis}}, in
known-third-party-libraries.properties) are downloaded when they are used, so
they work in a reload too. Other libraries do not.
This is how a coding agent adds a library. The AI tools of the camel-jbang-mcp
server tell it to declare
{{camel.jbang.dependencies=<groupId>:<artifactId>:<version>}} in
application.properties ({{DependencyLookup}}, {{BeanRefChecks}},
{{GroovyImportChecks}}). The agent does that while the app runs in dev mode.
The tools do not say that a restart is needed.
Proposal: when a reloaded properties file changes {{camel.jbang.dependencies}},
download the new dependencies before the beans and components of that reload
are created, as {{CommandLineDependencyDownloader}} does at startup
({{DependencyDownloader.downloadDependency}}). A dependency that is removed
stays on the classpath until a restart, which can be logged.
Related, found in the same test: when application.properties is saved together
with another file (here a route, found in the same scan of the folder), the
error is not logged at all. {{RouteWatcherReloadStrategy.onReloadBatch}}
(CAMEL-25041, 4.23.0) catches the failure of the batch, logs it at DEBUG, and
reloads the files one at a time. By then the properties component has the new
values, so the properties file has no changes left, and nothing fails. The
routes reload, the bean is missing, and the log does not say why. This is not
only about dependencies: the failure of any properties reload in a batch is
lost.
Found while testing CAMEL-25767.
_Claude Code on behalf of davsclaus_
--
This message was sent by Atlassian Jira
(v8.20.10#820010)