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

时间:2010-08-10 18:56:39

标签: spring maven-2 jstl

JSTL存在这个问题我在过去的几天里一直坚持下去。任何帮助表示赞赏。

Tomcat 6.0.28
Eclipse: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">

当我使用管理器在tomcat 6上部署Maven构建的战争时,它可以正常工作。 当我在eclipse中运行它作为“Run As&gt; Run On Server”时,我得到了这个:

  

无法从JAR文件“file:/&lt; - location - &gt; /。metadata / .plugins / org.eclipse.wst.server.core / tmp0 / wtpwebapps”中读取TLD“META-INF / c.tld” /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. 中   
  3. 确保使用与JSP 2.0一致的正确JSTL版本和URI。
  4.   

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

11 个答案:

答案 0 :(得分:16)

在我使用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编译库。

答案 1 :(得分:6)

删除:
     javax.servlet.jsp    JSP-API    2.0    提供  

从你的pom.xml

应该做..它在我的情况下工作: - )

答案 2 :(得分:5)

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

答案 3 :(得分:4)

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

答案 4 :(得分:2)

<强>的QuickFix:

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

运行此命令:

mvn eclipse:eclipse

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

重新发布。

<强>解释

您可能已将所有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>

这意味着复制EVERY .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文件。

有谁知道怎么做这个?

答案 5 :(得分:0)

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

javax.servlet  
org.apache.taglibs  

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

使用Eclipse,请确保您安装了适用于Eclipse的Maven Integration WTP &#39; 使用没有WTP的其他插件,eclipse会更改您的类路径并在您的webapps中包含servlet-api.jar。

答案 8 :(得分:0)

您必须在pom.xml中从jstl import中排除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>

答案 9 :(得分:0)

从中删除了jsp-api 2.0 .metadata / .plugins / org.eclipse.wst.server.core / TMP0 / wtpwebapps / MYPROJECT / WEB-INF / LIB / 这对我有用。

答案 10 :(得分:0)

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

我的tomcat服务器现在正常运行。