[ 
https://issues.apache.org/jira/browse/CAMEL-25528?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Federico Mariani updated CAMEL-25528:
-------------------------------------
    Description: 
*Problem*

{{camel run}} reads {{camel.jbang.dependencies}} (and 
{{camel.jbang.dependencies.main}} / {{.spring-boot}} / {{.quarkus}}) only from 
the profile properties: {{application.properties}} (and 
{{application-<profile>.properties}}) of the current directory, or of 
{{--source-dir}}. A properties file given explicitly on the command line, or 
with {{--properties}}, is only used for property placeholders: the dependencies 
declared in it are silently ignored, with no warning.

So a project laid out with the routes and their properties in a subfolder works 
with {{camel run camel}} (the directory runs as {{--source-dir}}, so 
{{camel/application.properties}} is the profile file), but not with {{camel run 
camel/*.yaml camel/application.properties}} from the same place.

The runtime still downloads jars on demand for the classes in 
{{camel-main-known-dependencies.properties}} and the other known-dependencies 
tables (e.g. {{org.postgresql.ds.PGSimpleDataSource}}), so some setups work by 
accident and hide the problem. Beans whose class is not mapped fail with 
{{ClassNotFoundException}}, for example the Spring transaction manager and the 
Spring transaction policy of a transacted route.

We found this while evaluating AI coding agents on legacy-to-Camel migrations: 
the agents declare {{camel.jbang.dependencies}} in 
{{camel/application.properties}}, as documented, run {{camel run camel/*.yaml 
camel/application.properties}} from the project root, and get up to 27 
{{ClassNotFoundException}} per attempt before they find a workaround 
({{--dep}}).

*Reproduction*

{{camel/routes.camel.yaml}}:
{code:yaml}
- beans:
    - name: myDataSource
      type: org.springframework.jdbc.datasource.DriverManagerDataSource
      properties:
        url: jdbc:h2:mem:demo
    - name: txManager
      type: org.springframework.jdbc.datasource.DataSourceTransactionManager
      properties:
        dataSource: "#bean:myDataSource"
- route:
    from:
      uri: timer:tick
      parameters:
        repeatCount: 1
      steps:
        - log: "Transaction manager created"
{code}

{{camel/application.properties}}:
{code}
camel.jbang.dependencies=camel:sql
{code}

>From the parent directory of {{camel}}:
{code}
camel run camel/routes.camel.yaml camel/application.properties
{code}

*Expected:* camel-sql (and so spring-jdbc) is on the classpath, as with {{camel 
run camel}} or {{camel run camel/routes.camel.yaml --dep=camel:sql}}.
*Actual:* {{Error creating bean: myDataSource ... 
java.lang.ClassNotFoundException: 
org.springframework.jdbc.datasource.DriverManagerDataSource}}; 
{{camel.jbang.dependencies}} is ignored without any message. ({{camel run 
camel}} and {{camel run camel/routes.camel.yaml --dep=camel:sql}} both start 
and log "Transaction manager created".)

*Proposal*

# {{camel run}} adds the dependencies ({{camel.jbang.dependencies}} and the 
variant of the runtime in use) of the local properties files given on the 
command line or with {{--properties}}, after the ones of the profile properties 
(which are not read twice) and the {{--dep}} ones. Remote files ({{github:}}, 
{{classpath:}}...) are skipped. The other {{camel.jbang.*}} keys keep being 
read from the profile properties only.
# Map the common Spring transaction classes in 
{{camel-main-known-dependencies.properties}}, so a transacted route's beans 
resolve on demand: {{DataSourceTransactionManager}}, {{JdbcTransactionManager}} 
and {{DriverManagerDataSource}} to {{camel:sql}} (spring-jdbc), 
{{PlatformTransactionManager}}, {{TransactionTemplate}} and 
{{org.apache.camel.spring.spi.SpringTransactionPolicy}} to {{camel:spring}} 
(spring-tx).
# Document where {{camel.jbang.dependencies}} is read from.

Related: CAMEL-22673 (dependencies in a non-profile {{--properties}} file not 
picked up, closed as Information Provided).


  was:
*Problem*

{{camel run}} reads {{camel.jbang.dependencies}} (and 
{{camel.jbang.dependencies.main}} / {{.spring-boot}} / {{.quarkus}}) only from 
the profile properties: {{application.properties}} (and 
{{application-<profile>.properties}}) of the current directory, or of 
{{--source-dir}}. A properties file given explicitly on the command line, or 
with {{--properties}}, is only used for property placeholders: the dependencies 
declared in it are silently ignored, with no warning.

So a project laid out with the routes and their properties in a subfolder works 
with {{camel run camel}} (the directory runs as {{--source-dir}}, so 
{{camel/application.properties}} is the profile file), but not with {{camel run 
camel/*.yaml camel/application.properties}} from the same place.

The runtime still downloads jars on demand for the classes in 
{{camel-main-known-dependencies.properties}} and the other known-dependencies 
tables (e.g. {{org.postgresql.ds.PGSimpleDataSource}}), so some setups work by 
accident and hide the problem. Beans whose class is not mapped fail with 
{{ClassNotFoundException}}, for example the Spring transaction manager and the 
Spring transaction policy of a transacted route.

We found this while evaluating AI coding agents on legacy-to-Camel migrations: 
the agents declare {{camel.jbang.dependencies}} in 
{{camel/application.properties}}, as documented, run {{camel run camel/*.yaml 
camel/application.properties}} from the project root, and get up to 27 
{{ClassNotFoundException}} per attempt before they find a workaround 
({{--dep}}).

*Reproduction*

{{camel/routes.camel.yaml}}:
{code:yaml}
- beans:
    - name: txManager
      type: org.springframework.jdbc.datasource.DataSourceTransactionManager
      properties:
        dataSource: "#bean:myDataSource"
    - name: myDataSource
      type: org.h2.jdbcx.JdbcDataSource
      properties:
        url: jdbc:h2:mem:demo
- route:
    from:
      uri: timer:tick
      parameters:
        repeatCount: 1
      steps:
        - log: "${bean:txManager}"
{code}

{{camel/application.properties}}:
{code}
camel.jbang.dependencies=camel:sql
{code}

>From the parent directory of {{camel}}:
{code}
camel run camel/routes.camel.yaml camel/application.properties
{code}

*Expected:* camel-sql (and so spring-jdbc) is on the classpath, as with {{camel 
run camel}} or {{camel run camel/routes.camel.yaml --dep=camel:sql}}.
*Actual:* {{java.lang.ClassNotFoundException: 
org.springframework.jdbc.datasource.DataSourceTransactionManager}}; 
{{camel.jbang.dependencies}} is ignored without any message.

*Proposal*

# {{camel run}} adds the dependencies ({{camel.jbang.dependencies}} and the 
variant of the runtime in use) of the local properties files given on the 
command line or with {{--properties}}, after the ones of the profile properties 
(which are not read twice) and the {{--dep}} ones. Remote files ({{github:}}, 
{{classpath:}}...) are skipped. The other {{camel.jbang.*}} keys keep being 
read from the profile properties only.
# Map the common Spring transaction classes in 
{{camel-main-known-dependencies.properties}}, so a transacted route's beans 
resolve on demand: {{DataSourceTransactionManager}}, {{JdbcTransactionManager}} 
and {{DriverManagerDataSource}} to {{camel:sql}} (spring-jdbc), 
{{PlatformTransactionManager}}, {{TransactionTemplate}} and 
{{org.apache.camel.spring.spi.SpringTransactionPolicy}} to {{camel:spring}} 
(spring-tx).
# Document where {{camel.jbang.dependencies}} is read from.

Related: CAMEL-22673 (dependencies in a non-profile {{--properties}} file not 
picked up, closed as Information Provided).



> camel-jbang - camel run ignores camel.jbang.dependencies in a properties file 
> given on the command line, such as camel/application.properties
> ---------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-25528
>                 URL: https://issues.apache.org/jira/browse/CAMEL-25528
>             Project: Camel
>          Issue Type: Improvement
>          Components: camel-jbang
>    Affects Versions: 4.22.1
>            Reporter: Federico Mariani
>            Assignee: Federico Mariani
>            Priority: Minor
>
> *Problem*
> {{camel run}} reads {{camel.jbang.dependencies}} (and 
> {{camel.jbang.dependencies.main}} / {{.spring-boot}} / {{.quarkus}}) only 
> from the profile properties: {{application.properties}} (and 
> {{application-<profile>.properties}}) of the current directory, or of 
> {{--source-dir}}. A properties file given explicitly on the command line, or 
> with {{--properties}}, is only used for property placeholders: the 
> dependencies declared in it are silently ignored, with no warning.
> So a project laid out with the routes and their properties in a subfolder 
> works with {{camel run camel}} (the directory runs as {{--source-dir}}, so 
> {{camel/application.properties}} is the profile file), but not with {{camel 
> run camel/*.yaml camel/application.properties}} from the same place.
> The runtime still downloads jars on demand for the classes in 
> {{camel-main-known-dependencies.properties}} and the other known-dependencies 
> tables (e.g. {{org.postgresql.ds.PGSimpleDataSource}}), so some setups work 
> by accident and hide the problem. Beans whose class is not mapped fail with 
> {{ClassNotFoundException}}, for example the Spring transaction manager and 
> the Spring transaction policy of a transacted route.
> We found this while evaluating AI coding agents on legacy-to-Camel 
> migrations: the agents declare {{camel.jbang.dependencies}} in 
> {{camel/application.properties}}, as documented, run {{camel run camel/*.yaml 
> camel/application.properties}} from the project root, and get up to 27 
> {{ClassNotFoundException}} per attempt before they find a workaround 
> ({{--dep}}).
> *Reproduction*
> {{camel/routes.camel.yaml}}:
> {code:yaml}
> - beans:
>     - name: myDataSource
>       type: org.springframework.jdbc.datasource.DriverManagerDataSource
>       properties:
>         url: jdbc:h2:mem:demo
>     - name: txManager
>       type: org.springframework.jdbc.datasource.DataSourceTransactionManager
>       properties:
>         dataSource: "#bean:myDataSource"
> - route:
>     from:
>       uri: timer:tick
>       parameters:
>         repeatCount: 1
>       steps:
>         - log: "Transaction manager created"
> {code}
> {{camel/application.properties}}:
> {code}
> camel.jbang.dependencies=camel:sql
> {code}
> From the parent directory of {{camel}}:
> {code}
> camel run camel/routes.camel.yaml camel/application.properties
> {code}
> *Expected:* camel-sql (and so spring-jdbc) is on the classpath, as with 
> {{camel run camel}} or {{camel run camel/routes.camel.yaml --dep=camel:sql}}.
> *Actual:* {{Error creating bean: myDataSource ... 
> java.lang.ClassNotFoundException: 
> org.springframework.jdbc.datasource.DriverManagerDataSource}}; 
> {{camel.jbang.dependencies}} is ignored without any message. ({{camel run 
> camel}} and {{camel run camel/routes.camel.yaml --dep=camel:sql}} both start 
> and log "Transaction manager created".)
> *Proposal*
> # {{camel run}} adds the dependencies ({{camel.jbang.dependencies}} and the 
> variant of the runtime in use) of the local properties files given on the 
> command line or with {{--properties}}, after the ones of the profile 
> properties (which are not read twice) and the {{--dep}} ones. Remote files 
> ({{github:}}, {{classpath:}}...) are skipped. The other {{camel.jbang.*}} 
> keys keep being read from the profile properties only.
> # Map the common Spring transaction classes in 
> {{camel-main-known-dependencies.properties}}, so a transacted route's beans 
> resolve on demand: {{DataSourceTransactionManager}}, 
> {{JdbcTransactionManager}} and {{DriverManagerDataSource}} to {{camel:sql}} 
> (spring-jdbc), {{PlatformTransactionManager}}, {{TransactionTemplate}} and 
> {{org.apache.camel.spring.spi.SpringTransactionPolicy}} to {{camel:spring}} 
> (spring-tx).
> # Document where {{camel.jbang.dependencies}} is read from.
> Related: CAMEL-22673 (dependencies in a non-profile {{--properties}} file not 
> picked up, closed as Information Provided).



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to