【问题标题】:What does "INFO: TLD skipped. URI is already defined" mean?“INFO:TLD 已跳过。URI 已定义”是什么意思?
【发布时间】:2012-02-02 05:01:13
【问题描述】:

在 Eclipse 中运行我的 JSF 2 应用程序时 我收到了几个 TLD 被跳过的信息日志,因为它已经定义如下:

Jan 3, 2012 7:24:45 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://www.springframework.org/tags/form is already defined
Jan 3, 2012 7:24:45 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://www.springframework.org/tags is already defined
Jan 3, 2012 7:24:45 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jstl/core_rt is already defined
Jan 3, 2012 7:24:45 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jstl/core is already defined
Jan 3, 2012 7:24:45 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jsp/jstl/core is already defined
Jan 3, 2012 7:24:45 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jstl/fmt_rt is already defined
Jan 3, 2012 7:24:45 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jstl/fmt is already defined
Jan 3, 2012 7:24:45 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jsp/jstl/fmt is already defined
Jan 3, 2012 7:24:45 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jsp/jstl/functions is already defined
Jan 3, 2012 7:24:45 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://jakarta.apache.org/taglibs/standard/permittedTaglibs is already defined
Jan 3, 2012 7:24:45 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://jakarta.apache.org/taglibs/standard/scriptfree is already defined
Jan 3, 2012 7:24:45 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jstl/sql_rt is already defined
Jan 3, 2012 7:24:45 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jstl/sql is already defined
Jan 3, 2012 7:24:45 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jsp/jstl/sql is already defined
Jan 3, 2012 7:24:45 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jstl/xml_rt is already defined
Jan 3, 2012 7:24:45 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jstl/xml is already defined
Jan 3, 2012 7:24:45 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jsp/jstl/xml is already defined

我很想知道,这个日志是什么意思?

【问题讨论】:

  • 请不要转发您的问题。
  • 链接的重复帖子已被删除

标签: jakarta-ee jsf-2 tomcat7 taglib


【解决方案1】:

这意味着您的 Web 应用的运行时类路径中有重复的 TLD 文件。由于 TLD 通常包含在库 JAR 文件中,这反过来意味着您的 Web 应用的运行时类路径中有重复的 JAR 文件。

假设您没有触及 appserver 的 /lib 文件夹或 JDK 的 /lib 文件夹,那么这些重复项位于 WAR 构建的 /WEB-INF/lib 文件夹中。清理它。

【讨论】:

    【解决方案2】:

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

    J2EE platform taglibs - Tomcat doesn't provide these
    
    web.xml entries
    
    JARS in WEB-INF/lib & TLDs under WEB-INF (equal priority)
    
    Additional entries from the container
    

    Tomcat 加载 tld 两次。

    1、Tomcat启动时会加载tld,在tld文件中寻找监听器。

    2,当第一个jsp文件被编译时,它会建立一个tld对的缓存。

    1、加载tld查找tld文件中的监听器

    当从 web.xml 加载时,它将 web.xml 中的 taglib-uri 和 tld 文件中的 uri 放入一个集合中。 从 WEB-INF 或 jar 加载时,uri 来自 tld 文件。

    Tomcat 需要避免重复添加 tld 监听器,因此它会检查 uri 是否存在于集合中。如果 uri 已经存在,它会记录您发布的消息并跳过添加 tld 侦听器。

    2、构建缓存

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

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

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

    如果存在uri aready,该条目将被忽略。

    【讨论】:

      【解决方案3】:

      这意味着例如,如果您使用 Tomcat 和 Maven(或其他服务器),则您发布了一个已经在服务器上找到的 JSTL 库,并且服务器确实会抱怨。

          <dependency>
              <groupId>javax.servlet</groupId>
              <artifactId>jstl</artifactId>
              <version>1.2</version>
          </dependency>
      

      在部署应用程序时(在 Tomcat 上),您会收到错误消息:

      INFO: TLD skipped. URI: http://java.sun.com/jstl/core_rt is already defined
      Mar 02, 2017 2:19:32 PM org.apache.catalina.startup.TaglibUriRule body
      

      解决方案是使用标签 'scope' 和值 'provided',因为 Tomcat 已经附带了 JSTL(它仅适用于您的 IDE):

          <dependency>
              <groupId>javax.servlet</groupId>
              <artifactId>jstl</artifactId>
              <version>1.2</version>
              <scope>provided</scope>
          </dependency>
      

      然后错误就会消失。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-04
        • 2018-02-06
        • 2017-02-05
        • 2011-01-15
        • 1970-01-01
        • 2022-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多