【问题标题】:INFO: TLD skipped. URI: <tag name URI> is already defined信息:TLD 已跳过。 URI:<标签名称 URI> 已定义
【发布时间】:2013-04-04 05:10:07
【问题描述】:

我有一个 Web 应用程序正在从 Tomcat 5.5.35 迁移到 Tomcat 7.0.39。目前,有几个自定义标签库,每个都在自己的tld 文件中定义。这是一个例子:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
    <tlib-version>1.0</tlib-version>
    <jsp-version>1.2</jsp-version>
    <short-name>customTag</short-name>
    <uri>http://www.something.com/util/customTag-db-taglib</uri>
    <description>
        Database tag library for Util 
    </description>
    <tag>
        <name>useBean</name>
        <tag-class>com.mx.releasemgr.tags.db.UseBeanTag</tag-class>
        <tei-class>com.mx.releasemgr.tags.db.UseBeanTEI</tei-class>
        <body-content>EMPTY</body-content>
        <attribute>
            <name>id</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>oid</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>oidParameter</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>type</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>scope</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
    ...
</taglib>

WEB-INF 文件夹中恰好有一份此 tld 文件的副本。它从未被放入jar 文件中。

web.xml 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
  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-app_3_0.xsd" version="3.0">
...
<jsp-config>
     <taglib>
    <taglib-uri>customTag</taglib-uri>
    <taglib-location>/WEB-INF/customTag.tld</taglib-location>
</taglib>
</jsp-config>
...

这个错误出现在catalina.out

Apr 11, 2013 3:50:08 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://www.mx.com/releasemgr/releasemgr-db-taglib is already defined

taglib 是这样导入的:

&lt;%@ taglib uri="customTag" prefix="db" %&gt;

我查看了this question,但它似乎并不适用。我添加了&lt;jsp-config&gt;,它没有帮助。我把标签库叫错了吗? URI 参数是否正确?任何帮助表示赞赏。

【问题讨论】:

  • 您可以尝试从 web.xml 中删除整个 &lt;jsp-config&gt;..&lt;/jsp-config&gt; 部分,看看它是否仍然找到标记库。如果是这样,它是在你不知道的地方定义的。
  • 我通过删除已经在 jar 文件和 WEB-INF 中定义的 tld 文件来做到这一点。这消除了错误,但现在我的 JSP 页面以纯文本形式提供??
  • 您需要将 tld 文件放在其中一个 jar 中,或者在 war 中的 WEB-INF 中,或者在最新版本的 JSP 中在 web.xml 中引用。不过只有一个地方。

标签: java jsp tomcat web.xml taglib


【解决方案1】:

规范要求的 URI 的优先级顺序是:

  1. J2EE 平台标记库 - Tomcat 不提供这些
  2. web.xml 条目
  3. WEB-INF/lib 中的 JARS 和 WEB-INF 下的 TLD(同等优先级)
  4. 容器中的其他条目

您的 tld 加载了两次,第一次来自 web.xml,第二次来自扫描 WEB-INF 及其子文件夹。

解决办法是

1、从web.xml中删除

2、把你的tld文件放到/WEB-INF/tags/


好的,这只是一个小故事。如果您想了解更多。

1、tomcat 5.5 也有同样的逻辑,只是不做烦人的日志。

2,这个日志是在tomcat启动的时候出现的。在 tomcat 启动时加载 tld用于在 tld 文件中查找侦听器。

3, tld真正用在jsp中就另当别论了。

当第一个 jsp 被编译时,tomcat 会为 uri 和 location 对建立一个缓存。

uri加载来自同一个顺序

1) web.xml 条目,标签 uri 取自 web.xml

2) 扫描WEB-INF下的tld文件,标签uri取自tld文件

3) 扫描jar,标签uri取自tld文件。

所以在您的配置中,customTag.tld 注册了 2 个 uri、customTag 和 http://www.mx.com/releasemgr/releasemgr-db-taglib

4) Tomcat 启动时。它加载 tld 以在 tld 文件中查找侦听器。

从 web.xml 加载时,它会将 customTag(来自 web.xml)和 http://www.mx.com/releasemgr/releasemgr-db-taglib(from tld 文件)放入一个集合中。

从 WEB-INF 加载时,uri 来自 tld 文件,即 ttp://www.mx.com/releasemgr/releasemgr-db-taglib。 Tomcat 需要避免重复添加 tld 监听器,因此它会检查 uri 是否存在于集合中。如果 uri 已经存在,它会记录消息并跳过添加 tld 侦听器。

把它们放在一起,

1、如果你的tld文件中没有监听器,Tomcat启动时不需要扫描tld。 您可以通过在上下文中将 processTlds 设置为 false 来禁用。

当第一个 jsp 被编译时,tomcat 会为 uri 和 location 对建立一个缓存。

2,您可以忽略警告。这只是为了避免在 tld 文件中重复加载侦听器。

【讨论】:

    猜你喜欢
    • 2012-02-02
    • 2010-10-25
    • 1970-01-01
    • 2023-01-09
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多