【问题标题】:Unable to read TLD "META-INF/c.tld"无法读取顶级域名“META-INF/c.tld”
【发布时间】:2011-03-28 00:21:03
【问题描述】:

过去几天我一直在纠结这个 JSTL 问题。任何帮助表示赞赏。

Tomcat 6.0.28
日食:太阳神

pom.xml:

 <dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>jstl</artifactId>
   <version>1.1.2</version>
 </dependency>
 <dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>servlet-api</artifactId>
  <version>2.4</version>
  <scope>provided</scope>
</dependency>
<dependency>   
  <groupId>taglibs</groupId> 
  <artifactId>standard</artifactId> 
  <version>1.1.2</version> 
</dependency>
<dependency>   
  <groupId>javax.servlet.jsp</groupId> 
  <artifactId>jsp-api</artifactId> 
  <version>2.0</version>
  <scope>provided</scope>
</dependency>

JSP:

<%@ page session="true"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="utilfn" uri="/utility-functions" %>

web.xml:

<web-app id="WebApp_ID" version="2.4" 
 xmlns="http://java.sun.com/xml/ns/j2ee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
  http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

当我使用管理器在 tomcat 6 上部署 Maven 构建的战争时,它工作正常。 当我在 Eclipse 中将它作为“运行方式 > 在服务器上运行”运行时,我得到了这个:

无法从 JAR 文件 "file://.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/Myproject 读取 TLD "META-INF/c.tld" /WEB-INF/lib/standard-1.1.2.jar": org.apache.jasper.JasperException: 无法加载或实例化 TagLibraryValidator 类:org.apache.taglibs.standard.tlv.JstlCoreTLV

无论我在哪里看,它都说同样的话:

  1. 确保 servlet-api 和 jsp-api 不在 lib 中
  2. 确保使用与 JSP 2.0 配套的正确 JSTL 版本和 URI。

而且他们似乎很好,因为我可以独立部署战争。那么这里有什么问题!?

【问题讨论】:

  • 问题写得很好,有很多例子。干得好。

标签: spring maven-2 jstl


【解决方案1】:

在我使用 Indigo Eclipse 3.7 并进行 m2e 的最后更新后,这个问题发生在我身上,我删除了它下面的依赖项,效果很好。

<dependency>
  <groupId>javax.servlet.jsp</groupId>
  <artifactId>jsp-api</artifactId>
  <version>2.1</version>
  <scope>provided</scope>
</dependency>

我不确定为什么问题消失了,因为我理解的 m2e 新版本已经有 jsp 编译库。

【讨论】:

    【解决方案2】:

    删除:
    javax.servlet.jsp jsp-api 2.0 假如

    来自你的 pom.xml,这应该可以......它在我的情况下有效:-)

    【讨论】:

      【解决方案3】:

      maven/m2eclipse 插件似乎有问题。即使我看到同样的问题。默认情况下,它将所有 jar 文件推送到服务器 lib 目录。其中包括范围“提供”的 jar 文件。此问题已在旧版本的 m2eclipse 中修复。不过好像又被介绍了。

      【讨论】:

      • 谢谢。是的,正如你所说,m2e 1.0 包括提供的 JAR。这是一个问题,因为 Tomcat 不想要 javax.servlet.jsp:jsp-api 正如上面 Sobree 所指出的那样。
      【解决方案4】:

      检查一下 .metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/Myproject/WEB-INF/lib/standard-1.1.2.jar 没有损坏(如果需要,请进行一些清理)。

      【讨论】:

      • 即使 standard-1.1.2.jar 不是问题,我仍然接受你的回答,因为我没有检查那个位置。我只是没想到。问题是当我在 Eclipse 中删除并重新配置我的服务器时,servlet-api.jar 以某种方式被复制到该位置。删除该文件解决了这个问题。每次我从服务器上下文菜单中选择“Clean”和“Clean Tomcat Work Directory”时,jar 都会出现在那里。我不确定为什么/如何。但截至目前,手动删除该文件使其正常工作。感谢您的回复!
      • 谢谢,这很有用。我仍然没有弄清楚罐子为什么/如何重新出现 - 你有吗?
      • 我也遇到过即使标记为 pom 中提供的 JAR 有时也会包含在内,我找到了一个解决方案,packagingExcludes stackoverflow.com/questions/6477504/…
      【解决方案5】:

      快速修复:

      备份 .classpath 和 .project 和 .settings/org.eclipse.wst.common.component。

      运行这个命令:

      mvn eclipse:eclipse
      

      或者,右键单击项目,在 Maven 子菜单中,您有一个 Update Project... 命令我认为做同样的事情。

      重新发布。

      说明:

      您可能将所有 Maven 依赖项作为部署程序集添加到您的项目中。这会将所有 Maven 类路径条目复制到 WEB-INF/lib 目录。打开您的 .classpath 文件(位于项目的根目录),您可能会找到以下 XML:

      <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER">
          <attributes>
              <attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
          </attributes>
      </classpathentry>
      

      这意味着复制每个 .jar 文件,这在这种情况下会成为问题。

      更新项目应该删除上面的 XML 块并明确列出 JAR 文件。

      所以,如果你重新打开 .classpath,你会看到这个:

      <classpathentry kind="var" path="M2_REPO/com/google/code/gson/gson/2.2.1/gson-2.2.1.jar" sourcepath="M2_REPO/com/google/code/gson/gson/2.2.1/gson-2.2.1-sources.jar"/>
      <classpathentry kind="var" path="M2_REPO/javax/servlet/jsp/jsp-api/2.1/jsp-api-2.1.jar" sourcepath="M2_REPO/javax/servlet/jsp/jsp-api/2.1/jsp-api-2.1-sources.jar"/>
      ...
      

      这是您仍然需要的类路径,但它删除了将它们复制到 lib 的依赖项。相反,如果您打开 .settings/org.eclipse.wst.common.component/,您会看到 JAR 文件现在已明确列出:

      <dependent-module deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/com/google/code/gson/gson/2.2.1/gson-2.2.1.jar">
        <dependency-type>uses</dependency-type>
      </dependent-module>
      

      而且,您会注意到现在缺少 jsp-api-2.1.jar。将相同的逻辑应用于其他 JAR 文件。

      有谁知道如何使这个自动化?

      【讨论】:

        【解决方案6】:

        平台:eclipse 3.7 indigo、tomcat 6.0.29
        在 pom.xml 中注释掉以下依赖项:

        javax.servlet  
        org.apache.taglibs  
        

        这解决了问题(因为它们是通过 tomcat 提供的)...

        【讨论】:

        • 提问者在你回答前几个月就接受了完全不同的解决方案,所以这不是他的问题。
        【解决方案7】:

        我同意杰的回答。我在这里有同样的问题。如果我从 pom.xlm 中删除 jsp-api,maven 测试将失败,因为它在 jsp-api jar 中找不到 jspWriter 类。如果我将 jsp-api 保留在 pom 中并将其设置为“提供”或“测试”,则当 m2e 插件将 jsp-api jar 推送到 maven 依赖项时,tomcat 端将失败,然后将其包含在我的 tomcat 部署的库中。我会说这是插件问题,因为 jsp-api 必须在 pom.xml 中声明为提供,因为它是由应用程序服务器提供的。 我找不到解决此问题的任何方法,只能在每次 tomcat 服务器同步后手动删除 jsp-api。

        【讨论】:

          【解决方案8】:

          使用 Eclipse,请确保您安装了 'Maven Integration for Eclipse WTP' 使用没有 WTP 的其他插件,eclipse 更改您的类路径并在您的 web 应用程序中包含 servlet-api.jar。

          【讨论】:

          • 虽然您的回答可能会有所帮助,但已经通过其他方式解决了。
          【解决方案9】:

          您必须从 pom.xml 中的 jstl 导入中排除 jsp-api 依赖项:

          <dependency>
              <groupId>javax.servlet.jsp.jstl</groupId>
              <artifactId>jstl-api</artifactId>
              <version>1.2</version>
              <exclusions>
                  <exclusion>
                      <groupId>javax.servlet</groupId>
                      <artifactId>servlet-api</artifactId>
                  </exclusion>
                  <exclusion>
                      <artifactId>jsp-api</artifactId>
                      <groupId>javax.servlet.jsp</groupId>
                  </exclusion>
              </exclusions>
          </dependency>
          

          【讨论】:

            【解决方案10】:

            移除了 jsp-api 2.0 .metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/Myproject/WEB-INF/lib/ 这对我有用。

            【讨论】:

              【解决方案11】:

              我在 netbeans IDE 8.0.2 中遇到了同样的错误。事实证明,我的部分设置为 8080 用于传出和关机。我将 Tomcat 服务器的传出更改为 8081。有效!然后我更改了关闭端口 8005。要更改,请转到工具>服务器>

              我的 tomcat 服务器现在可以工作了。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-05-06
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多