我想在我的Java EE 6(Jboss AS 7.1.1Final)应用程序中使用PrimeFaces:
EAR
|- lib/
| |- primefaces-4.0.jar
|
|- ejb-module.jar
|- webbapp1.war
|- webapp2.war
但是,在部署到JBoss AS 7时,我遇到了一些例外情况,例如:
java.lang.LinkageError: Failed to link org/primefaces/context/PrimeFacesContextFactory
(请参阅完整堆栈跟踪here on PasteBin)
对于EAR的pom.xml,我正在使用PrimeFaces的Maven依赖:
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>4.0</version>
<type>jar</type>
</dependency>
但是,当我将依赖项放入一个WAR的pom.xml中时,它可以工作,但我想在多个WAR之间共享primefaces库。
我已经google了很多但没有找到任何解决方案。谢谢你的任何建议。
答案 0 :(得分:7)
你做不到。 Webapp库不属于EAR/lib
,而属于WAR/WEB-INF/lib
。 EAR/lib
永远不会被用作EAR所有WAR项目的“共享库”。它仅适用于EAR的所有EJB项目(业务服务)。
您所面临的PrimeFaces特定类上的LinkageError
是由于({默认的)特定于webapp的库(如JSF API / impl)不可用于EAR/lib
所使用的类加载器。这会导致EAR/lib
中WAR/WEB-INF/lib
中具有(虚拟)依赖关系的所有库在LinkageError
等类加载错误时失败。
如果你真的需要一个所有WAR项目的“共享库”,那么最好的办法是将库放在Java EE容器本身(就像默认情况下已经为JSF API / impl库完成的那样)。在JBoss的情况下,这被称为“模块”。但是我不建议这样做,因为这使得webapp不能在容器之间移植,而没有通过serveradmin专门配置容器。只需为每个webapp提供一组自己的webapp库。