Apache Camel 3.17+ camel-main能否直接加载经典XML配置独立运行
Apache Camel 3.17+ 独立运行加载XML DSL 说明
Apache Camel 3.17及以上版本完全支持在camel-main独立运行模式下直接加载XML DSL路由,不需要依赖Spring、CDI等外部容器,但你提供的XML示例是Spring集成场景下的专用写法,需要做小幅调整才能被camel-main原生加载。
前置依赖准备
首先需要引入核心依赖,以Maven为例:
<!-- camel-main 核心依赖 --> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-main</artifactId> <version>3.17.0</version> <!-- 替换为你实际使用的3.17+版本号 --> </dependency> <!-- 原生XML DSL解析依赖,无额外Spring传递依赖 --> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-xml-jaxb</artifactId> <version>3.17.0</version> </dependency>
如果一定要加载外层包裹Spring <beans> 标签、包含Spring Bean定义的旧格式XML,需要额外引入camel-spring依赖,但这种方式本质是走Spring上下文加载逻辑,不属于camel-main原生支持范畴,更推荐使用无Spring依赖的原生XML写法。
XML路由文件格式调整
camel-main原生加载的XML DSL不需要外层嵌套Spring的<beans>节点,支持两种根节点写法:
- 仅定义路由时直接用
<routes>作为根节点 - 需要定义全局组件、异常策略、数据格式等Camel上下文级配置时,用
<camelContext>作为根节点
修正后的XML示例如下:
<?xml version="1.0" encoding="UTF-8"?> <!-- 根节点直接用camelContext即可,不需要套beans标签 --> <camelContext xmlns="http://camel.apache.org/schema/spring"> <!-- 全局配置、组件注册、异常处理等内容可以写在这里 --> <route id="demoRoute"> <from uri="direct:input"/> <log message="log message for demo"/> <to uri="file:src/main/resources/data/"/> </route> </camelContext>
加载XML路由的两种方式
方式1:自动扫描加载(推荐)
camel-main默认会自动扫描classpath下classpath:camel/*.xml、classpath:routes/**/*.xml路径下的所有XML路由文件,不需要手动写加载逻辑,启动类可以简化为:
public class MainApp { public static void main(String... args) throws Exception { Main main = new Main(); main.run(args); } }
如果你的XML文件存放在自定义路径,可以在application.properties中配置扫描规则:
# 配置自定义XML路由扫描路径 camel.main.routes-include-pattern = classpath:my-custom-routes/**/*.xml
方式2:代码手动指定加载路径
如果需要在代码中灵活控制要加载的XML文件,可以手动指定加载路径:
public class MainApp { public static void main(String... args) throws Exception { Main main = new Main(); // 手动指定要加载的XML文件,支持多个路径用逗号分隔 main.configure().withRoutesIncludePattern("classpath:demo-route.xml,classpath:other-routes/*.xml"); main.run(args); } }
注意事项
- 不要直接加载外层包裹Spring
<beans>标签、依赖Spring Bean定义的XML配置,这类配置属于camel-spring模块专属格式,camel-main原生解析器无法识别,会抛出解析异常。 - 如果你的路由逻辑需要依赖Spring容器管理的Bean,建议直接使用
camel-spring或camel-spring-boot模块启动,不要使用camel-main原生XML加载方案。 - Camel 3.17+版本支持多DSL混合加载,Java DSL、XML DSL、YAML DSL编写的路由可以同时存在,camel-main启动时会自动识别并加载所有符合规则的路由定义。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

