【问题标题】:Skinny WAR, libraries in EAR: "struts-tags not found" errorSkinny WAR,EAR 中的库:“未找到 struts-tags”错误
【发布时间】:2013-10-15 12:08:21
【问题描述】:
在一个 Java EE 项目中,我将所有库从 WAR/WEB-INF/lib 移到了 EAR/lib。
打开一个 JSP,现在我得到这个错误:
Struts 检测到一个未处理的异常:
消息:
找不到文件“/struts-tags”
文件:org/apache/jasper/compiler/DefaultErrorHandler.java
行号:51
Stacktraces
org.apache.jasper.JasperException: File "/struts-tags" not found
...........
...........
如何解决这个问题?
【问题讨论】:
标签:
java
jakarta-ee
struts2
war
ear
【解决方案1】:
将库从 WAR 移动到 EAR 可能非常有用,例如如果您在一个 EAR 中有多个 WAR*,以避免库冗余。
* 注意:在 Struts2 中使用多个 WAR,您可能在某些应用服务器中遇到问题:read more on the official documentation。
要使 Skinny WAR(没有库的 WAR)工作,条件是:
-
WAR 的 META-INF/MANIFEST.MF 必须包含链接您的库的 Class-Path 属性:
Class-Path: lib/struts2-core-2.3.15.2.jar
lib/xwork-core-2.3.15.2.jar
lib/all_your_libraries_here...
-
EAR 的application.xml 必须包含:
<library-directory>lib</library-directory>.
在Maven上实现这个条件,不需要在EAR的POM.xml中声明WAR的POM.xml各个库的依赖关系,可以使用this amazing trick。
也就是说,问题中报告的问题是因为 TLD 查找仅在 WAR 上执行,EAR 超出范围
(AFAIK,无法在 EAR 中查找 TLD,但我希望被证明是错误的)。
解决办法:
从struts2-core-2.3.x.x.jar 中提取struts-tags.tld,并将其放在(每个)WAR/WEB-INF 文件夹下。 这与任何类型的 TLD 相关JAR 中的文件,而不仅仅是 Struts2。
在 JSP 中:
<%@ taglib prefix="s" uri="/WEB-INF/struts-tags.tld" %>