0

我在 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.xmlweb.xml文件。我的应用程序基于 Spring 和 JSF 集成。我正在使用Tomcat服务器。它包含文件context.xmlweb.xml和. 我需要把那个标签放在哪里?还是有替代解决方案?我不想删除文件。server.xmltomcat-users.xml<dependency>el-api.jar

4

1 回答 1

1

<dependency>标签是Maven的一部分。Maven 是一个依赖项管理工具,它使您能够管理依赖项,而无需手动携带松散的 JAR 文件。本质上,Maven 将自动下载正确的编译时依赖项,并且 Maven 将自动填充/WEB-INF/lib正确的运行时依赖项,所有这些都基于pom.xml. 您在那里的条目基本上告诉 Maven 将 Spring EL 依赖项排除在/WEB-INF/lib.

由于您没有使用 Maven,因此您本质上只是做与 Maven 在幕后所做的完全相同的事情:不要将 Spring EL JAR 文件放在/WEB-INF/lib.

但是,我想知道这是否是正确的解决方案。我不这么认为。

EL API 默认情况下已由Tomcat 本身提供。因此,如果它不是相同的版本,那么放置你自己的/WEB-INF/lib只会导致问题。您不清楚为什么不想删除它,也许您错误地认为特定的 JAR 文件可以解决您没有告诉任何内容的特定问题,但毕竟它实际上是错误的解决方案。

保留servletcontainer 本身已经提供/WEB-INF/lib的库。无论您想通过放置 EL API JAR 来解决什么问题,都必须以不同的方式解决。也许您正在使用 Eclipse 并试图以错误的方式修复编译错误。请参阅下面的第二个链接以获取正确的解决方案。/WEB-INF/libjavax.el

也可以看看:

于 2013-01-16T11:20:34.523 回答