代码之家  ›  专栏  ›  技术社区  ›  DS.

无法读取TLD“META-INF/C.TLD”

  •  18
  • DS.  · 技术社区  · 15 年前

    过去几天,我一直在关注JSTL的这个问题。感谢您的帮助。

    Tomcat 60.28
    月食:Helios

    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">
    

    当我使用管理器在Tomcat6上部署Maven构建的战争时,它工作得很好。 当我在Eclipse中以“在服务器上运行”的方式运行它时,我会得到:

    无法从jar文件读取tld“meta-inf/c.tld”,文件:/<-location->/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/myproject/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. 确保使用正确的JSTL版本和JSP 2.0附带的URI。

    他们似乎很好,因为我可以独立部署战争。怎么了!?

    11 回复  |  直到 10 年前
        1
  •  4
  •   Pascal Thivent    15 年前

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

        2
  •  16
  •   Sobree Maenchi    14 年前

    在我使用IndigoEclipse3.7并进行了M2E的最新更新之后,这个问题发生在我身上,我删除了下面的依赖项,它工作得很好。

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

    我不知道问题为什么会消失,因为我理解M2E的新版本已经有了JSP编译库。

        3
  •  6
  •   Alok Avjeet    15 年前

    移除:
    javax.servlet.jsp版 JSP API 二 假如

    从pom.xml,应该可以……它在我的情况下起作用了:-)

        4
  •  5
  •   Jay    15 年前

    看起来maven/m2eclipse插件有问题。即使我也看到了同样的问题。默认情况下,它将所有JAR文件推送到服务器lib目录。其中包括范围“提供的”JAR文件。这个问题在M2Eclipse的旧版本中得到了修复。但它似乎又被引入了。

        5
  •  2
  •   Josh Unger Brian Roach    13 年前

    Quickfix:

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

    运行此命令:

    mvn eclipse:eclipse
    

    或者, 右击 在项目上,在 马文 子菜单,你有一个 更新项目… 命令,我想也是这样。

    重新发布。

    说明:

    您可能将所有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
  •  0
  •   theRiley Priyal    14 年前

    平台:Eclipse 3.7 Indigo,Tomcat 6.0.29
    在pom.xml中注释了以下依赖项:

    javax.servlet  
    org.apache.taglibs  
    

    这就解决了问题(通过Tomcat提供了这些问题)。

        7
  •  0
  •   Leo Huang    14 年前

    我同意杰伊的回答。我也有同样的问题。如果我从pom.xlm中删除jsp api,maven测试将失败,因为它在jsp api jar中找不到jspwriter类。如果我将JSP API保存在POM中并将其设置为“provided”或“test”,Tomcat端将失败,因为M2E插件将JSP API JAR推送到maven依赖项中,然后这些依赖项将包含在我的Tomcat部署的lib中。我会说它是插件问题,因为JSPAPI必须在pom.xml中声明,因为它是由应用服务器提供的。 我找不到任何方法来解决这个问题,但是在Tomcat服务器同步之后每次都要手动删除JSPAPI。

        8
  •  0
  •   Thibaut    13 年前

    对于Eclipse,请确保您安装了“Maven Integration for Eclipse” WTP ’ 使用另一个不带wtp的插件,Eclipse会更改类路径,并在webapps中包含servlet-api.jar。

        9
  •  0
  •   hadf    13 年前

    在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
  •  0
  •   charu    12 年前

    已从中删除JSP API 2.0 .metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/myproject/web-inf/lib/ 这对我有用。

        11
  •  0
  •   rene1234    10 年前

    我在Netbeans的IDE8.0.2中得到了同样的错误。结果我的角色被设置为8080,用于输出和关闭。我把Tomcat服务器的输出更改为8081。它奏效了!然后我更改了关闭端口8005。要更改,请转到“工具”>“服务器”>

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