Apache Camel从2.x升级至3.2.0遇ClassNotFoundException及版本兼容问题
Apache Camel升级问题排查与版本兼容解答
问题背景
当前项目基于Java 8、Spring Boot 2.7.12、Apache Camel 2.25.4构建,计划将Camel升级至支持Java 8的3.2.X版本。升级camel-core到3.2.0后,启动应用抛出java.lang.ClassNotFoundException: org.apache.camel.spi.ReloadStrategy错误。同时已知Camel 3.4.X起不再支持Java 8,但无法找到Camel 3.4.X对应的Spring Boot兼容版本,需确认是否需要升级Spring Boot、适配版本及查询途径。
关联RouteBuilder配置代码
package accountService; import java.net.ConnectException; import java.util.concurrent.RejectedExecutionException; import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.ExchangeTimedOutException; import org.apache.camel.Processor; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.consul.ConsulConfiguration; import org.apache.camel.impl.DefaultCamelContext; import org.apache.camel.impl.DefaultModel; import org.apache.camel.model.cloud.ConsulServiceCallServiceDiscoveryConfiguration; import org.apache.camel.model.cloud.ServiceCallConfigurationDefinition; import org.apache.camel.spring.boot.cloud.CamelCloudConfigurationProperties.ServiceDiscovery; import org.apache.camel.spring.boot.cloud.CamelCloudConfigurationProperties.ServiceDiscoveryConfiguration; import org.apache.kafka.common.errors.TimeoutException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import errorhandlers.CustomException; @Component public class BuilderService extends RouteBuilder{ @Value("${currentEnv.port}") int port; @Value("${currentEnv.host}") String host; @Value("${consul.serviceRegUrl}") String consulRegUrl; @Value("${consul.serviceDeregUrl}") String consulDeRegUrl; @Value("${kafka.kafkaReq}") String kafkaReq; @Value("${currentEnv.minThread}") String minThread; @Value("${currentEnv.maxThread}") String maxThread; @Value("${consul.url}") String url; @Autowired CamelContext context; @Override public void configure() throws Exception { ServiceCallConfigurationDefinition sep = new ServiceCallConfigurationDefinition(); ConsulServiceCallServiceDiscoveryConfiguration con = sep.consulServiceDiscovery(); con.setUrl(url); sep.setComponent("jetty"); camelContext.setServiceCallConfiguration(sep); restConfiguration().component("jetty").host(host).port(port).endpointProperty("minThreads", minThread) .endpointProperty("maxThreads", maxThread).enableCORS(true).endpointProperty("bridgeEndpoint", "true"); from("direct:start").routeId("SERVICE") .setHeader(Exchange.HTTP_METHOD, constant("PUT")) .setHeader(Exchange.CONTENT_TYPE, constant("application/json")) .to(consulRegUrl); //from("direct:stop").shutdownRunningTask(ShutdownRunningTask.CompleteAllTasks) from("direct:stop").setHeader(Exchange.HTTP_METHOD, constant("PUT")) .toD(consulDeRegUrl+"/${header.id}"); } }
问题解决与说明
1. org.apache.camel.spi.ReloadStrategy类找不到问题
- 原因:Camel 3.x重构了SPI模块,
ReloadStrategy从camel-core迁移至camel-base模块,3.2版本中该类不再包含在camel-core依赖内。 - 解决:在项目依赖中添加
camel-base(版本3.2.0),以Maven为例:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-base</artifactId> <version>3.2.0</version> </dependency>
- 额外检查:确保所有Camel相关依赖版本统一为3.2.0,避免混合2.x与3.x版本引发依赖冲突。
2. Spring Boot与Camel版本兼容问题
- 是否需要升级Spring Boot?
无需强制升级。Camel 3.2.x官方兼容Spring Boot 2.3.x至2.7.x版本,当前使用的Spring Boot 2.7.12在兼容范围内,可直接配合Camel 3.2.x使用。 - 关于Camel 3.4.x的说明:
Camel 3.4.x不再支持Java 8,因此当前Java 8环境无法升级至该版本及以上,无需考虑此路径。若后续升级Java版本,Camel 3.4.x兼容Spring Boot 2.3.x至2.4.x版本。 - 版本兼容查询途径:
查看Camel官方文档的「Spring Boot Integration」章节,其中包含明确的版本对应表;或查看Camel Spring Boot Starter的pom.xml文件,里面标注了兼容的Spring Boot版本范围。
内容的提问来源于stack exchange,提问作者VENUGOPAL M G
相关产品推荐
相关产品推荐

