You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Karaf 4.4部署Camel Blueprint项目时出现javax.el依赖错误

问题描述

我有一个基于Camel 2.23、Java 8的Blueprint项目,部署到Karaf 4.4时遇到javax.el相关的依赖错误,具体错误信息如下:

Camel Blueprint
Camel context "BaseRestContext"
Exception: Failed to create route SYNC-RESPONSE: Route(SYNC-RESPONSE)[[From[direct-vm:SyncResponse]] -> [OnEx... because of Failed to create Producer for endpoint: bean-validator://beanValidation. Reason: javax.validation.ValidationException: HV000183: Unable to initialize 'javax.el.ExpressionFactory'. Check that you have the EL dependencies on the classpath, or use ParameterMessageInterpolator instead
org.apache.camel.FailedToCreateRouteException: Failed to create route SYNC-RESPONSE: Route(SYNC-RESPONSE)[[From[direct-vm:SyncResponse]] -> [OnEx... because of Failed to create Producer for endpoint: bean-validator://beanValidation. Reason: javax.validation.ValidationException: HV000183: Unable to initialize 'javax.el.ExpressionFactory'. Check that you have the EL dependencies on the classpath, or use ParameterMessageInterpolator instead
        at org.apache.camel.impl.RouteService.warmUp(RouteService.java:147)
        at org.apache.camel.impl.DefaultCamelContext.doWarmUpRoutes(DefaultCamelContext.java:3953)
        at org.apache.camel.impl.DefaultCamelContext.safelyStartRouteServices(DefaultCamelContext.java:3860)
        at org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRoutes(DefaultCamelContext.java:3646)
        at org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:3489)
        at org.apache.camel.impl.DefaultCamelContext$4.call(DefaultCamelContext.java:3248)
        at org.apache.camel.impl.DefaultCamelContext$4.call(DefaultCamelContext.java:3244)
        at org.apache.camel.impl.DefaultCamelContext.doWithDefinedClassLoader(DefaultCamelContext.java:3267)
        at org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:3244)
        at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:72)
        at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:3160)
        at org.apache.camel.blueprint.BlueprintCamelContext.start(BlueprintCamelContext.java:255)
        at org.apache.camel.blueprint.BlueprintCamelContext.maybeStart(BlueprintCamelContext.java:297)
        at org.apache.camel.blueprint.BlueprintCamelContext.blueprintEvent(BlueprintCamelContext.java:188)
        at org.apache.aries.blueprint.container.BlueprintEventDispatcher$3.call(BlueprintEventDispatcher.java:197)
        at org.apache.aries.blueprint.container.BlueprintEventDispatcher$3.call(BlueprintEventDispatcher.java:195)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: org.apache.camel.FailedToCreateProducerException: Failed to create Producer for endpoint: bean-validator://beanValidation. Reason: javax.validation.ValidationException: HV000183: Unable to initialize 'javax.el.ExpressionFactory'. Check that you have the EL dependencies on the classpath, or use ParameterMessageInterpolator instead
        at org.apache.camel.impl.ProducerCache.doGetProducer(ProducerCache.java:584)
        at org.apache.camel.impl.ProducerCache.acquireProducer(ProducerCache.java:168)
        at org.apache.camel.processor.SendProcessor.doStart(SendProcessor.java:248)
        at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:72)
        at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:75)
        at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:60)
        at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:104)
        at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:90)
        at org.apache.camel.processor.interceptor.DefaultChannel.doStart(DefaultChannel.java:160)
        at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:72)
        at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:75)
        at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:60)
        at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:104)
        at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:62)
        at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:104)
        at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:90)
        at org.apache.camel.processor.MulticastProcessor.doStart(MulticastProcessor.java:1185)
        at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:72)
        at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:75)
        at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:60)
        at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:104)
        at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:90)
        at org.apache.camel.processor.TryProcessor.doStart(TryProcessor.java:163)
        at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:72)
        at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:75)
        at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:60)
        at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:104)
        at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:90)
        at org.apache.camel.processor.interceptor.DefaultChannel.doStart(DefaultChannel.java:160)
        at org.apache.camel.support.ServiceSupport.start(ServiceHelper.java:72)
        at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:75)
        at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:60)
        at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:104)
        at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:90)
        at org.apache.camel.processor.DelegateAsyncProcessor.doStart(DelegateAsyncProcessor.java:80)
        at org.apache.camel.support.ServiceSupport.start(ServiceHelper.java:72)
        at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:75)
        at org.apache.camel.impl.RouteService.startChildService(RouteService.java:370)
        at org.apache.camel.impl.RouteService.doWarmUp(RouteService.java:196)
        at org.apache.camel.impl.RouteService.warmUp(RouteService.java:145)
        ... 24 more
Caused by: javax.validation.ValidationException: HV000183: Unable to initialize 'javax.el.ExpressionFactory'. Check that you have the EL dependencies on the classpath, or use ParameterMessageInterpolator instead
        at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.buildExpressionFactory(ResourceBundleMessageInterpolator.java:123)
        at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.<init>(ResourceBundleMessageInterpolator.java:46)
        at org.hibernate.validator.internal.engine.ConfigurationImpl.getDefaultMessageInterpolator(ConfigurationImpl.java:474)
        at org.hibernate.validator.internal.engine.ConfigurationImpl.getDefaultMessageInterpolatorConfiguredWithClassLoader(ConfigurationImpl.java:650)
        at org.hibernate.validator.internal.engine.ConfigurationImpl.getMessageInterpolator(ConfigurationImpl.java:397)
        at org.hibernate.validator.internal.engine.ValidatorFactoryImpl.<init>(ValidatorFactoryImpl.java:183)
        at org.hibernate.validator.HibernateValidator.buildValidatorFactory(HibernateValidator.java:38)
        at org.hibernate.validator.internal.engine.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.java:364)
        at org.apache.camel.component.bean.validator.ValidatorFactories.buildValidatorFactory(ValidatorFactories.java:63)
        at org.apache.camel.component.bean.validator.BeanValidatorEndpoint.createProducer(BeanValidatorEndpoint.java:69)
        at org.apache.camel.impl.ProducerCache.doGetProducer(ProducerCache.java:573)
        ... 63 more

我尝试在项目的pom文件中添加以下依赖,但问题仍未解决:

<dependency>
   <groupId>javax.el</groupId>
   <artifactId>javax.el-api</artifactId>
   <version>3.0.1-b06</version>
</dependency>-->
<dependency>
 <groupId>org.glassfish</groupId>
 <artifactId>javax.el</artifactId>
 <version>3.0.1-b09</version>
</dependency>

我也曾替换这些依赖,只使用最新版本,但问题依旧存在:

<dependency>
   <groupId>org.glassfish</groupId>
   <artifactId>jakarta.el</artifactId>
   <version>3.0.3</version>
   <!--<scope>compile</scope>
<type>jar</type> -->    
</dependency>
解决方法
  • Karaf环境下安装EL特性包
    Karaf 4.4的OSGi类加载机制导致直接在pom中添加依赖无法生效,需要明确安装EL相关特性。执行以下Karaf命令:
feature:install el-3.0

若偏好JBoss的EL实现,可执行:

feature:install jboss-el-3.0
  • 调整依赖Scope与包导入配置
    将pom中的EL依赖scope设为provided,避免打包时与Karaf容器的依赖冲突:
<dependency>
    <groupId>javax.el</groupId>
    <artifactId>javax.el-api</artifactId>
    <version>3.0.1-b06</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.el</artifactId>
    <version>3.0.1-b09</version>
    <scope>provided</scope>
</dependency>

同时在maven-bundle-plugin中配置导入javax.el包:

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <extensions>true</extensions>
    <configuration>
        <instructions>
            <Import-Package>
                javax.el.*,
                *
            </Import-Package>
        </instructions>
    </configuration>
</plugin>
  • 配置Bean Validator使用ParameterMessageInterpolator
    如果不想依赖EL环境,可直接修改Camel的Bean Validator配置,跳过EL工厂初始化:
    在Blueprint XML中定义自定义ValidatorFactory和BeanValidator组件:
<bean id="validatorFactory" class="org.hibernate.validator.HibernateValidator" factory-method="buildValidatorFactory">
    <constructor-arg>
        <bean class="org.hibernate.validator.internal.engine.ConfigurationImpl">
            <method name="messageInterpolator">
                <argument>
                    <bean class="org.hibernate.validator.messageinterpolation.ParameterMessageInterpolator"/>
                </argument>
            </method>
        </bean>
    </constructor-arg>
</bean>

<bean id="beanValidator" class="org.apache.camel.component.bean.validator.BeanValidatorComponent">
    <property name="validatorFactory" ref="validatorFactory"/>
</bean>

路由中使用该自定义组件:

<route id="SYNC-RESPONSE">
    <from uri="direct-vm:SyncResponse"/>
    <to uri="beanValidator://beanValidation"/>
    <!-- 其他路由逻辑 -->
</route>
  • 检查版本兼容性
    Camel 2.23默认依赖Hibernate Validator 5.4.x版本,需确保EL依赖版本与之匹配,避免使用过高版本的EL包导致兼容性问题。

内容的提问来源于stack exchange,提问作者David Florez Mendez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 13:47:03