我正尝试在needs javax.el的Google App Engine应用上升级到休眠验证器版本6,因此我在自己的依赖项中添加了org.glassfish:javax.el:jar:3.0.1-b10
。
但是,不使用它:
在本地开发环境中,我可以使用ExpressionFactory
创建一个新的ExpressionFactory.newInstance()
。 ExpressionFactory
来自本地Jetty安装jetty93/jetty-distribution/lib/apache-jsp/org.mortbay.jasper.apache-el-8.0.33.jar
,它从同一jar返回实现org.apache.el.ExpressionFactoryImpl
。
在已部署的GAE环境中,ExpressionFactory
来自java8_runtime/runtime-shared.jar!/javax/el/ExpressionFactory.class
,但是即使存在ExpressionFactory.newInstance()
,org.apache.el.ExpressionFactoryImpl
仍尝试获取com.sun.el.ExpressionFactoryImpl
。 / p>
在两种环境中,我都可以从com.sun.el.ExpressionFactoryImpl
手动加载WEB-INF/lib/javax.el-3.0.1-b10.jar
,因此它存在于类路径中:
final Constructor<ExpressionFactoryImpl> constructor = com.sun.el.ExpressionFactoryImpl.class.getConstructor();
final ExpressionFactoryImpl expressionFactory = constructor.newInstance();
org.apache.el.ExpressionFactoryImpl
在类路径上,GAE环境仍然如此热衷于加载com.sun.el.ExpressionFactoryImpl
?ExpressionFactoryImpl
,以便创建休眠的ValidatorFactory?我是否必须手动提供MessageInterpolator
才能提供正确的ExpressionFactoryImpl
?答案 0 :(得分:1)
我终于通过将系统属性添加到appengine-web.xml中来解决了这个问题:
<system-properties>
<property name="javax.el.ExpressionFactory" value="com.sun.el.ExpressionFactoryImpl" />
</system-properties>
另一种可能性是添加文件“ META-INF / services / javax.el.ExpressionFactory”,内容如下:
com.sun.el.ExpressionFactoryImpl
另请参阅this answer
我没有测试第二种方法,但是它在apache-el ExpressionFactory的源代码中具有最高的优先级,而系统属性只是第三种尝试。