首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果JAR被放在应用服务器的类路径上,我们如何从JSP引用它

如果JAR被放在应用服务器的类路径上,我们如何从JSP引用它
EN

Stack Overflow用户
提问于 2009-10-28 04:20:14
回答 3查看 2.8K关注 0票数 3

在我们的应用程序上,我们收到一个错误,内容是:

代码语言:javascript
复制
PWC6117: File "/struts-tags" not found

文件中给出错误的代码是:

代码语言:javascript
复制
<%@ taglib prefix="s" uri="/struts-tags" %>

该文件位于struts2-core.jar中,该文件位于应用服务器(Sun9.1)的类路径中。

当jar实际位于应用程序的WEB-INF/lib中时,与位于appserver的类路径中相比,代码将工作得很好,并且不会出现错误。但我们不能改变这一点。它必须在appservers类路径上。

但是,我们应该如何更改代码才能消除这个错误呢?

我可以在我的web.xml中创建映射,以便更改标记uri。但是taglib-location应该改成什么呢?所以它引用了应用服务器类路径?

代码语言:javascript
复制
<taglib>
<taglib-uri>/WEB-INF/struts-tags.tld</taglib-uri> 
<taglib-location>/WEB-INF/struts-tags.tld</taglib-location> 
</taglib>
EN

回答 3

Stack Overflow用户

发布于 2009-10-28 04:30:51

可能是应用程序服务器和web应用程序本身在运行两个不同的类加载器。因此,确保jar文件不仅在应用程序服务器的类路径中可用,而且在应用程序本身的类路径中可用。如果有一个“共享的”lib目录(这就是它在WebSphere中的位置……不确定Sun)把它放在那里

票数 0
EN

Stack Overflow用户

发布于 2013-06-25 12:19:03

JSP标准不要求应用服务器使用类路径来定位/加载标记库tld文件。这只是应用程序服务器可用来存储常用TLD的一个选项。但是,容器将使用类路径来定位与标记库关联的文件。但是作为开始步骤,它必须首先定位并加载tld文件;为此,假设类路径不存在。

根据JSP 2.2标准,JSP容器分两步将taglib指令中使用的URI映射到标记库描述符:

  1. 它将URI解析为webapp TLD资源URL路径(一个上下文相关的URL路径,以"/“开头,没有协议或主机-即相对于webapp的基本URL )。

此映射通过标记库映射进行,构建自(按优先级顺序):

代码语言:javascript
复制
- A) Java EE platform tag library mappings (JSP Tag Library & JSF libraries)
- B) Taglib Map in web.xml
- C) Implicit Map Entries from TLDs in WEB-INF/lib/_.jar, WEB-INF/_.tld & WEB-INF/\*_/_.tld
- D) Implicit Map Entries from the Container
- E) A fallback, targetted to casual development use, where URI is interpreted as a direct path to the TLD.

这里的B)或D)可能对您有用。但D)是容器可用的可选优先级扩展机制,其中它插入容器实现/提供的标签库的映射。正在阅读SUN 9.1文档,似乎没有提供D)。因此,如果Sun9.1在类路径上的JAR中没有检测到TLD,那么您应该使用B),就像您在Q中已经开始做的那样。

  1. 它从TLD资源路径派生TLD对象。TLD资源路径应解析为:

代码语言:javascript
复制
- a TLD file directly, 
- or to a JAR file that has a TLD file at location META-INF/taglib.tld. 

如果TLD资源路径不是这两种情况之一,则会发生致命的转换错误。

这些目前都不适用于您。因此,根据标准,您要么需要将JAR内容插入到生成的TLD文件中,要么应该在类路径上将 META-INF/taglib.tld 插入到jar文件中,然后将<>e241><>e145>指向JAR文件<>e246>。

票数 0
EN

Stack Overflow用户

发布于 2013-06-25 21:08:01

我假设您已经熟悉了将TLD放入WEB-INF中时的工作方式,以及容器如何构建映射以匹配JSP指令的uri属性。因此,我将在这里更多地关注您的classpath问题。

根据JSP2.0规范

容器仅在以下四个位置查找TLD文件

采用/META-INF/MyTags.tld

  • /WEB-INF/lib/tag-lib.jar和/META-INF/Any-Sub-Dir/MyTags.tld

  • /WEB-INF/MyTags.tld
  • /WEB-INF/Any-Sub-Dir/MyTags.tld
  • /WEB-INF/lib/tag-lib.jar

为了不破坏JSP2.0之前的web应用程序,最新的容器仍然支持在web.xml中找到的任何<taglib>映射。但是,它对您没有任何帮助,因为<taglib-location>仍然受上述位置的约束。我还没有遇到任何流行的容器,它允许从应用程序的/WEB-INF外部加载.tld

回答

但是,该约束仅适用于标记库描述符。实际的标记实现类只需要在classpath中。通常,标记类(以及tld)被打包到jar (如struts2-core.jar)中,然后放入WEB-INF/lib中。

但是,它们很可能是分开的:在WEB-INF/classes中;或者在WEB-INF/lib中的其他jar中,或者应用服务器的共享库本身。所以,你需要做的就是:

  • 只从您的struts2-core.jar
  • Place中提取/META-INF/struts-tags.tld struts-tags.tld inside /WEB-INF (/tlds/struts等)
  • 删除<taglib>映射(如果在JSP2.0兼容容器上运行)

有些人更喜欢保留映射,只是为了记录正在加载的所有tld文件的位置。或者,您可以将/META-INF/struts-tags.tld捆绑在struts2-core-tags.jar中,然后将其放入/WEB-INF/lib中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1633414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档