如何在Camel上下文文件中引用外部JAR的路由配置
跨JAR引用Camel公共路由实现方案
你碰到的java.io.FileNotFoundException本质是两个问题:要么项目A打包时根本没把logrouteTest.xml放进JAR的类路径,要么你写的导入路径没扫到外部JAR里的资源。把项目A作为ESB公共库、不需要单独部署A直接在B中复用路由的需求完全可实现,按下面步骤配置就行:
1. 先修正项目A的打包规则,确保路由文件进入类路径
Java项目默认只会把src/main/resources目录下的文件打进JAR的类路径,如果你把xml放在src/main/java的代码目录下,打包时默认会被过滤掉,根本不会进JAR包。
- 把
logrouteTest.xml挪到项目A的src/main/resources/com/tcl/Testjar/目录下,保持路径和你写的导入路径完全一致,注意大小写匹配 - 执行打包命令后,解压生成的项目A JAR包,确认在包内的
com/tcl/Testjar/路径下能直接看到logrouteTest.xml文件,这一步是后续配置生效的基础
2. 修正项目B的资源导入配置
你之前写的classpath:前缀只会扫描当前项目B自身类路径下的资源,不会去扫描依赖JAR里的内容,把导入配置改成带通配符的写法:
<import resource="classpath*:com/tcl/Testjar/logrouteTest.xml"/>
注意:
classpath后面的*不能漏,加了这个符号才会扫描所有依赖JAR内的匹配资源,不加只会查找当前项目自身的文件。
同时确认项目B中引入项目A依赖的scope是compile,不要用provided、test这类不会加入运行时类路径的scope配置。
3. 公共ESB库的更优封装实践
如果要长期把项目A作为公共Camel组件库,不建议零散导入单个路由xml,维护成本很高。可以在项目A里做一层统一配置封装:
- 在项目A中写一个统一的Spring配置类,把所有公共路由、公共组件都在这个类里批量导入:
@Configuration @ImportResource("classpath:com/tcl/Testjar/logrouteTest.xml") public class CommonESBLibraryConfig { // 公共的日志拦截器、序列化组件、通用连接工厂都可以在这里统一注册 }
- 项目B里不需要再写xml路径导入,直接引入这个配置类即可:
@SpringBootApplication @Import(CommonESBLibraryConfig.class) public class ProjectBStartApp { public static void main(String[] args) { SpringApplication.run(ProjectBStartApp.class, args); } }
这种配置方式下,项目A就是普通的第三方Jar依赖,不需要单独部署,Camel启动时会自动加载JAR内定义的所有路由,和项目B本地定义的路由使用体验完全一致,也不会再出现路径找不到的问题。
内容的提问来源于stack exchange,提问作者Chennai Cheetah
相关产品推荐
相关产品推荐

