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の除外という1つの解決策を見つけました。解決策は、以下のコードを に追加する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.xmlweb.xmlserver.xmlおよびが含まれていますtomcat-users.xml<dependency>そのタグをどこに置く必要がありますか?または、代替ソリューションはありますか?ファイルを削除したくありませんel-api.jar

4

1 に答える 1

1

<dependency>タグはMavenの一部です。Maven は、ゆるい JAR ファイルを手動で持ち運ぶ必要なく、依存関係を管理できる依存関係管理ツールです。基本的に、Maven は適切なコンパイル時の依存関係を自動的にダウンロードし、Maven は/WEB-INF/lib適切な実行時依存関係を自動的に入力します。これらはすべて .xml の構成に基づいていますpom.xml。そこにあるエントリは、基本的に、Spring EL 依存関係を に含めることを除外するように Maven に指示し/WEB-INF/libます。

Maven を使用していないので、本質的には、Maven がカバーの下で行っていることとまったく同じことを行う必要があります。つまり、Spring EL JAR ファイルを/WEB-INF/lib.

しかし、それが正しい解決策であるかどうかは疑問です。私はそうは思わない。

EL API はデフォルトで、Tomcat 自体によってすでに提供されています。したがって、独自のものを配置して/WEB-INF/libも、同じバージョンでない場合にのみ問題が発生します。なぜそれを削除したくないのか明確ではありません。おそらく、特定の JAR ファイルが、何も言わなかった特定の問題を解決すると誤って考えたのかもしれませんが、結局のところ、それは実際には間違った解決策です。

サーブレットコンテナ自体によってすでに/WEB-INF/lib提供されているライブラリを解放してください。EL API JAR を配置することで解決しようと考えていた問題は、別の方法で解決する必要があります。Eclipse を使用していて、コンパイル エラーを間違った方法で修正しようとしている可能性があります。適切な解決策については、以下の 2 番目のリンクを参照してください。/WEB-INF/libjavax.el

以下も参照してください。

于 2013-01-16T11:20:34.523 に答える