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

Vilmos Nagy updated CAMEL-23370:
--------------------------------
    Description: 
*Description:*
After upgrading to a version including Apache Camel change from CAMEL-21944, 
route discovery using wildcard patterns no longer works correctly when running 
as a Spring Boot fat JAR.

Previously working configurations using recursive classpath scanning 
({{{}*{*}/{*}.xml{}}}) now fail at runtime with {{{}java -jar{}}}, while still 
working when executed from IDE (exploded classpath).

{*}This worked correctly in Camel 4.11.0, including when running via {{{}java 
-jar{}}}, and appears to be a regression in newer versions.{*}{*}{{*}}

A minimal reproducer is available here: 
[https://github.com/vilmosnagy/camel-spring-boot-examples/tree/vilmos/poc-broken-routes-include-pattern]

(GitHub fork of the sample project demonstrating the issue).
----
*Environment:*
 * Camel version: 4.21.0-SNAPSHOT (regression compared to 4.11.0)
 * Spring Boot: 4.0.6
 * Packaging: Spring Boot fat JAR ({{{}java -jar{}}})
 * OS: Linux (reproducible)

----
*Configuration:*

{{{}application.properties{}}}:

 
{code:java}
camel.main.routes-include-pattern=classpath:camel/*/.xml{code}

Project structure:

 

 
{code:java}
src/main/resources/
├── application.properties
└── camel
└── test-route
└── route.xml{code}
 
----
*Steps to reproduce:*
 # Create a Spring Boot + Camel application
 # Place XML routes under nested directories (e.g. 
{{{}camel/test-route/route.xml{}}})
 # Use:

{code:java}
camel.main.routes-include-pattern=classpath:camel/*/.xml{code}

 # Build fat JAR:

{code:java}
mvn clean package{code}
 
 # Run:

{code:java}
java -jar target/app.jar{code}

 

----
*Expected behavior:*
All XML routes under {{camel/**}} are discovered and loaded, consistent with:
 * Running from IDE
 * *Running via {{java -jar}} on Camel 4.11.0*

----
*Actual behavior:*
Application fails during startup with:
java.io.IOException: No input stream for: 
nested:.../app.jar/!BOOT-INF/classes/!/camel/route.xml
Stacktrace indicates failure in resource loading:
DefaultSourceLoader.loadResource
RoutesConfigurer.addDiscoveredRoutes
*Important observations:*
 * Running from IDE (exploded classpath) → *works*
 * Running fat JAR ({{{}java -jar{}}}) → *fails*
 * Camel 4.11.0:
 ** IDE → *works*
 ** {{java -jar}} → *works*
 * Newer versions (incl. 4.21.0-SNAPSHOT):
 ** IDE → *works*
 ** {{java -jar}} → *fails*
 * Narrowing pattern to a single directory works:
camel.main.routes-include-pattern=classpath:camel/test-route/*.xml
 
but this is not viable for multiple subdirectories.

----
*Suspected cause:*
The issue appears related to changes introduced in CAMEL-21944, specifically 
replacing:
final ResourceLoader loader = PluginHelper.getResourceLoader(getCamelContext());
resources.add(loader.resolveResource(name));
with:
Resource resource = new PackageScanJarResource("jar", url, name);
resources.add(resource);
This seems to break handling of nested resources inside Spring Boot fat JARs 
({{{}BOOT-INF/classes{}}}), particularly when using recursive glob patterns.
----
*Additional notes:*
 * The failing path includes {{nested:}} URLs, suggesting incompatibility with 
Spring Boot’s nested JAR classloader.
 * Clear regression from Camel 4.11.0 behavior.

----
*Workaround:*
camel.main.routes-include-pattern=classpath:camel/test-route/*.xml
(does not scale for multiple directories)
----
*Contribution:*
If this is confirmed to be a bug, we’re happy to help investigate further or 
contribute a fix.

  was:
*Description:*
After upgrading to a version including Apache Camel change from CAMEL-21944, 
route discovery using wildcard patterns no longer works correctly when running 
as a Spring Boot fat JAR.

Previously working configurations using recursive classpath scanning 
({{{}**/*.xml{}}}) now fail at runtime with {{{}java -jar{}}}, while still 
working when executed from IDE (exploded classpath).

{*}This worked correctly in Camel 4.11.0, including when running via {{{}java 
-jar{}}}, and appears to be a regression in newer versions.{*}{*}{*}

A minimal reproducer is available here: 
[https://github.com/vilmosnagy/camel-spring-boot-examples/tree/vilmos/poc-broken-routes-include-pattern]

(GitHub fork of the sample project demonstrating the issue).
----
*Environment:*
 * Camel version: 4.21.0-SNAPSHOT (regression compared to 4.11.0)
 * Spring Boot: 4.0.6
 * Packaging: Spring Boot fat JAR ({{{}java -jar{}}})
 * OS: Linux (reproducible)

----
*Configuration:*

{{{}application.properties{}}}:
camel.main.routes-include-pattern=classpath:camel/**/*.xml
Project structure:
src/main/resources/
├── application.properties
└── camel
└── test-route
└── route.xml
----
*Steps to reproduce:*
 # Create a Spring Boot + Camel application
 # Place XML routes under nested directories (e.g. 
{{{}camel/test-route/route.xml{}}})
 # Use:
camel.main.routes-include-pattern=classpath:camel/**/*.xml
 

 # Build fat JAR:
mvn clean package
 
 
 # Run:
java -jar target/app.jar
 

----
*Expected behavior:*
All XML routes under {{camel/**}} are discovered and loaded, consistent with:
 * Running from IDE
 * *Running via {{java -jar}} on Camel 4.11.0*

----
*Actual behavior:*
Application fails during startup with:
java.io.IOException: No input stream for: 
nested:.../app.jar/!BOOT-INF/classes/!/camel/route.xml
Stacktrace indicates failure in resource loading:
DefaultSourceLoader.loadResource
RoutesConfigurer.addDiscoveredRoutes
*Important observations:*
 * Running from IDE (exploded classpath) → *works*
 * Running fat JAR ({{{}java -jar{}}}) → *fails*
 * Camel 4.11.0:
 ** IDE → *works*
 ** {{java -jar}} → *works*
 * Newer versions (incl. 4.21.0-SNAPSHOT):
 ** IDE → *works*
 ** {{java -jar}} → *fails*
 * Narrowing pattern to a single directory works:
camel.main.routes-include-pattern=classpath:camel/test-route/*.xml
 
but this is not viable for multiple subdirectories.

----
*Suspected cause:*
The issue appears related to changes introduced in CAMEL-21944, specifically 
replacing:
final ResourceLoader loader = PluginHelper.getResourceLoader(getCamelContext());
resources.add(loader.resolveResource(name));
with:
Resource resource = new PackageScanJarResource("jar", url, name);
resources.add(resource);
This seems to break handling of nested resources inside Spring Boot fat JARs 
({{{}BOOT-INF/classes{}}}), particularly when using recursive glob patterns.
----
*Additional notes:*
 * The failing path includes {{nested:}} URLs, suggesting incompatibility with 
Spring Boot’s nested JAR classloader.
 * Clear regression from Camel 4.11.0 behavior.

----
*Workaround:*
camel.main.routes-include-pattern=classpath:camel/test-route/*.xml
(does not scale for multiple directories)
----
*Contribution:*
If this is confirmed to be a bug, we’re happy to help investigate further or 
contribute a fix.


> camel.main.routes-include-pattern with classpath:**/*.xml fails in Spring 
> Boot fat JAR (works in IDE, regression since 4.11.0)
> ------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-23370
>                 URL: https://issues.apache.org/jira/browse/CAMEL-23370
>             Project: Camel
>          Issue Type: Bug
>    Affects Versions: 4.20.0
>            Reporter: Vilmos Nagy
>            Priority: Minor
>
> *Description:*
> After upgrading to a version including Apache Camel change from CAMEL-21944, 
> route discovery using wildcard patterns no longer works correctly when 
> running as a Spring Boot fat JAR.
> Previously working configurations using recursive classpath scanning 
> ({{{}*{*}/{*}.xml{}}}) now fail at runtime with {{{}java -jar{}}}, while 
> still working when executed from IDE (exploded classpath).
> {*}This worked correctly in Camel 4.11.0, including when running via {{{}java 
> -jar{}}}, and appears to be a regression in newer versions.{*}{*}{{*}}
> A minimal reproducer is available here: 
> [https://github.com/vilmosnagy/camel-spring-boot-examples/tree/vilmos/poc-broken-routes-include-pattern]
> (GitHub fork of the sample project demonstrating the issue).
> ----
> *Environment:*
>  * Camel version: 4.21.0-SNAPSHOT (regression compared to 4.11.0)
>  * Spring Boot: 4.0.6
>  * Packaging: Spring Boot fat JAR ({{{}java -jar{}}})
>  * OS: Linux (reproducible)
> ----
> *Configuration:*
> {{{}application.properties{}}}:
>  
> {code:java}
> camel.main.routes-include-pattern=classpath:camel/*/.xml{code}
> Project structure:
>  
>  
> {code:java}
> src/main/resources/
> ├── application.properties
> └── camel
> └── test-route
> └── route.xml{code}
>  
> ----
> *Steps to reproduce:*
>  # Create a Spring Boot + Camel application
>  # Place XML routes under nested directories (e.g. 
> {{{}camel/test-route/route.xml{}}})
>  # Use:
> {code:java}
> camel.main.routes-include-pattern=classpath:camel/*/.xml{code}
>  # Build fat JAR:
> {code:java}
> mvn clean package{code}
>  
>  # Run:
> {code:java}
> java -jar target/app.jar{code}
>  
> ----
> *Expected behavior:*
> All XML routes under {{camel/**}} are discovered and loaded, consistent with:
>  * Running from IDE
>  * *Running via {{java -jar}} on Camel 4.11.0*
> ----
> *Actual behavior:*
> Application fails during startup with:
> java.io.IOException: No input stream for: 
> nested:.../app.jar/!BOOT-INF/classes/!/camel/route.xml
> Stacktrace indicates failure in resource loading:
> DefaultSourceLoader.loadResource
> RoutesConfigurer.addDiscoveredRoutes
> *Important observations:*
>  * Running from IDE (exploded classpath) → *works*
>  * Running fat JAR ({{{}java -jar{}}}) → *fails*
>  * Camel 4.11.0:
>  ** IDE → *works*
>  ** {{java -jar}} → *works*
>  * Newer versions (incl. 4.21.0-SNAPSHOT):
>  ** IDE → *works*
>  ** {{java -jar}} → *fails*
>  * Narrowing pattern to a single directory works:
> camel.main.routes-include-pattern=classpath:camel/test-route/*.xml
>  
> but this is not viable for multiple subdirectories.
> ----
> *Suspected cause:*
> The issue appears related to changes introduced in CAMEL-21944, specifically 
> replacing:
> final ResourceLoader loader = 
> PluginHelper.getResourceLoader(getCamelContext());
> resources.add(loader.resolveResource(name));
> with:
> Resource resource = new PackageScanJarResource("jar", url, name);
> resources.add(resource);
> This seems to break handling of nested resources inside Spring Boot fat JARs 
> ({{{}BOOT-INF/classes{}}}), particularly when using recursive glob patterns.
> ----
> *Additional notes:*
>  * The failing path includes {{nested:}} URLs, suggesting incompatibility 
> with Spring Boot’s nested JAR classloader.
>  * Clear regression from Camel 4.11.0 behavior.
> ----
> *Workaround:*
> camel.main.routes-include-pattern=classpath:camel/test-route/*.xml
> (does not scale for multiple directories)
> ----
> *Contribution:*
> If this is confirmed to be a bug, we’re happy to help investigate further or 
> contribute a fix.



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

Reply via email to