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)

Reply via email to