我在JSF中生成动态组件,这是我的faces-config.xml
文件:
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0" >
<application>
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
<resource-bundle>
<base-name>build</base-name>
<var>build</var>
</resource-bundle>
<resource-bundle>
<base-name>message</base-name>
<var>message</var>
</resource-bundle>
<locale-config>
<default-locale>en</default-locale>
<supported-locale>fr</supported-locale>
<supported-locale>es</supported-locale>
</locale-config>
</application>
我收到了如下链接错误
SEVERE: Exception sending context initialized event to listener instance of class com.sun.faces.config.ConfigureListener
java.lang.RuntimeException: java.lang.LinkageError: loader constraint violation: when resolving interface method "javax.servlet.jsp.JspApplicationContext.getExpressionFactory()Ljavax/el/ExpressionFactory;" the class loader (instance of org/apache/catalina/loader/WebappClassLoader) of the current class, com/sun/faces/config/ConfigureListener, and the class loader (instance of org/apache/catalina/loader/StandardClassLoader) for resolved class, javax/servlet/jsp/JspApplicationContext, have different Class objects for the type javax/el/ExpressionFactory used in the signature
at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:294)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4723)
at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5226)
at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5221)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
我在el-api jar
文件夹中添加了/WEB-INF/lib
文件。我找到了一个解决方案,因冲突而排除了Spring EL。解决方案是在pom.xml
中添加以下代码,但我的应用程序中没有该文件。
<dependencies>
<dependency org="org.springframework" name="org.springframework.web.servlet" rev="3.0.5.RELEASE">
<!-- Fix for java.lang.LinkageError: loader constraint violation -->
<exclude name="com.springsource.javax.el" />
</dependency>
</dependencies>
我需要在哪里放置此<dependency>
标记?我不知道。在我的应用程序中,我只有faces-config.xml
,application-context.xml
和web.xml
个文件。我的应用程序是Spring和JSF集成。我正在使用Tomcat服务器。它包含文件context.xml
,web.xml
,server.xml
和tomcat-users.xml
。我需要在哪里放置<dependency>
标签?或者有替代解决方案吗?我不想删除el-api.jar
文件。
答案 0 :(得分:1)
<dependency>
代码是Maven的一部分。 Maven是一个依赖管理工具,它使您能够管理依赖项,而无需手动携带松散的JAR文件。实质上,Maven将自动下载正确的编译时依赖项,Maven将自动使用正确的运行时依赖项填充/WEB-INF/lib
,所有这些都基于pom.xml
中的配置。您在那里的条目基本上告诉Maven将Spring EL依赖项排除在/WEB-INF/lib
之外。
由于你没有使用Maven,你完全可以做与Maven在幕后所做的完全相同的事情: not 将Spring EL JAR文件放在{{1}中}。
然而,我想知道这是否是正确的解决方案。我不这么认为。
默认情况下,EL API是由Tomcat本身提供的已经。因此,将自己放在/WEB-INF/lib
中只会导致问题,如果版本不同的话。你不清楚为什么你不想删除它,也许你错误地认为特定的JAR文件可以解决你没有告诉任何事情的特定问题,但毕竟它实际上是错误的解决方案。
保持/WEB-INF/lib
免受servletcontainer本身提供的已经的库的影响。无论您在/WEB-INF/lib
中放置EL API JAR,您认为要解决的问题都必须以不同方式解决。也许您正在使用Eclipse并且正在尝试以错误的方式修复/WEB-INF/lib
编译错误。请参阅下面的第二个链接以获得正确的解决方案。