Vilmos Nagy created CAMEL-23370:
-----------------------------------
Summary: 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
*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.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)