Eclipse“找不到自定义标签库描述符”(不是JSTL!)

61
我有一个Java EE项目,使用Ant构建没有问题,在JBoss上部署也完美运行。这个项目包括一些自定义标签库(不是JSTL!),它们也能正常工作。
问题出现在Eclipse IDE(Ganymede)上:每个使用我们自定义标签的JSP文件中,JSP解析器都会标记taglib include line并显示以下错误:
“Cannot find the tag library descriptor for (example).tld”
这也导致每个tab库的使用被标记为错误,并且由于IDE没有它们的定义,无法检查标记参数等内容。
我们完美运行的JSP文件充斥着大量红色错误,我的眼睛开始疼痛。
我该如何简单地告诉Eclipse:“你要找的标记库描述符是”src/web/WEB-INF/(example)-taglib/(example).tld”?
我已经在Eclipse支持论坛上提出了这个问题,但没有得到有用的结果。

1
这个问题充满了无意义的答案。这个问题不是关于JSTL,而是关于用户自定义foo.tld文件中真正的自制JSP标签。有关如何安装JSTL的真正问题和答案可以在这里找到:Can not find the tag library descriptor for “http://java.sun.com/jsp/jstl/core” - BalusC
22个回答

28
在Eclipse Helios中,“项目属性”中的“Java EE模块依赖项”已被替换为“部署程序集”。
因此,要解决这个在Eclipse Helios中的问题,我采取的方式如下:
  • 在包资源管理器中右键单击项目,选择“导入...”
  • 接受默认选择“文件系统”,然后点击“下一步”
  • 在“来自目录”行上点击“浏览”,进入您的Tomcat安装目录并定位文件webapps/examples/WEB-INF/lib(我使用的是Tomcat 6,其他版本的Tomcat可能有路径webapps/jsp-examples/WEB-INF/lib)。进入该路径后,点击“确定”。
  • 单击jstl.jar和standard.jar旁边的复选框以激活它们
  • 在“到文件夹”行上点击“浏览”,选择库文件夹。我在项目中使用/lib。
  • 点击“完成”
  • 在包资源管理器视图中右键单击项目,选择“属性”(或按Alt + Enter)
  • 点击“Java Build Path”
  • 点击“添加JAR”,点击您的项目,文件夹lib,在jstl.jar上选择,然后点击“确定”
  • 点击“添加JAR”,点击您的项目,文件夹lib,在standard.jar上选择,然后点击“确定”
  • 点击OK以关闭属性对话框
  • 单击“问题”视图,然后选择消息“Classpath entry .../jstl.jar will not be exported or published. Runtime ClassNotFoundExceptions may result.”
  • 右键单击它并选择“快速修复”。
  • 接受默认值“将相关的原始类路径条目标记为发布/导出依赖项”,然后点击“完成”。
  • 对于standard.jar也做同样的操作
这样就解决了问题。但如果您想要检查在“部署程序集”中发生了什么,请再次打开项目属性,选择“部署程序集”,然后您会看到standard.jar和jstl.jar已添加到WEB-INF/lib文件夹中。

1
同时适用于Eclipse 4.4.0(月球)版本。 - Alex Cornford
也适用于火星。 - DataCat Robin
2
这个答案只描述了如何以一种狡猾的方式安装JSTL,因此并没有回答OP关于自定义标签库的具体问题。OP问题的真正答案在这里:下面。如何正确安装JSTL的方法在这里回答:找不到“http://java.sun.com/jsp/jstl/core”的标签库描述符 - BalusC

19
这是我的问题以及我如何解决它的过程...
我已经尝试了上面提到的所有方法,但仍然收到这个错误。结果发现我使用的URI http://java.sun.com/jsp/jstl/fmthttp://java.sun.com/jsp/jstl/core 是不正确的。
尝试将上述的URI更换为:
http://java.sun.com/jstl/fmt
http://java.sun.com/jstl/core

同时,请确保在您的类路径中引用了正确的JAR文件。


11
如果你想要使用JSTL 1.2版本,请使用http://java.sun.com/jsp/jstl/*,如果想要使用JSTL 1.0版本,则使用http://java.sun.com/jstl/*。请注意,翻译内容不能改变原文的意思,并且不提供任何额外的解释。 - FuePi
谢谢,那个起作用了。同时我可以在NetBeans中运行项目而没有错误,但是使用了http://java.sun.com/jsp/jstl/core让我有点困惑。 - John Doe

15

我遇到了同样的问题,一个条纹标签库URI显示为找不到。我正在使用Indigo和Maven,当我检查属性-> Java Build Path-> Order&Export Tab时,我发现(在一个新的项目检出上),出于某些原因,“Maven Dependencies”复选框未被选中。只需勾选该框并执行Maven clean install即可清除所有错误。

我想知道为什么Eclipse不默认将Maven依赖项添加到构建路径中...


我的Maven Clean install是什么意思?我的意思是,在“右键单击项目”>> Maven提供的选项中,我没有看到任何类似的东西。在命令行上执行mvn clean install似乎完全不相关。FYI:如果我将项目部署在Tomcat上,“独立运行”,则可以正常运行,但在Eclipse中运行时会抛出“The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application”的错误。 也许我应该将Eclipse仅用作高级编辑器,并停止对它有太多期望。 - Adriano
当我更改了组织中指向的Nexus存储库时,结果是OP的原始错误。然后我发现Maven依赖项复选框未被选中(在阅读您的答案后)。因此,我勾选了它并重新构建了项目,但错误仍然存在。然后我右键单击-> Maven->使用“强制更新快照/发布”选项更新Maven项目,错误消失了。但是,当我再次查看“顺序和导出”选项卡时,“Maven Dependencies”未被选中!这是可重复的。但至少错误已经消失了。 - Adam

10

原来的问题是,Eclipse并没有将这个项目视为Java EE项目;它是一个3.1版本的旧项目,而我们现在使用的Eclipse 3.5需要在项目配置文件中设置几个“natures”(本质属性)。

<natures>
    <nature>org.eclipse.jdt.core.javanature</nature>
    <nature>InCode.inCodeNature</nature>
    <nature>org.eclipse.dltk.javascript.core.nature</nature>
    <nature>net.sf.eclipsecs.core.CheckstyleNature</nature>
    <nature>org.eclipse.wst.jsdt.core.jsNature</nature>
    <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
    <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
    <nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
</natures>

我创建了一个新的“动态Web项目”,成功读取其JSP文件并与旧项目的配置进行对比,从而找到了原因。

唯一找到的添加方法是通过编辑.project文件,但重新打开项目后,一切都神奇地正常工作了。 由pribeiro上面提到的设置参考不必要,因为该项目已符合默认设置。

pribeiro和nitind的答案都给了我启发,让我能够开始搜索,谢谢。

是否有一种在UI内部编辑这些“nature”的方法?


1
项目属性中的“工程结构”可能是解决方案。我遇到了类似的“找不到标签库描述符”的问题,当我在项目结构下检查正确的项目类型时,问题得到了解决。 - hexium

8
遇到了相同的问题,我在我的Web项目pom中加入了以下内容(我正在使用Maven):
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version> <!-- just used the latest version, make sure you use the one you need -->
    <scope>provided</scope>
</dependency>

这解决了问题,我使用了“provided”范围,因为像 OP 一样,所有东西在 JBoss 中已经正常工作。
以下是我找到解决方案的位置:http://alfredjava.wordpress.com/2008/12/22/jstl-connot-resolved/

4
当我尝试在JSP中包含JSTL核心库时:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

我在 Eclipse (Indigo) 中遇到了以下错误:

Can not find the tag library descriptor for "http://java.sun.com/jsp/jstl/core"

我进入了“项目属性” -> “目标运行时”,然后勾选了我正在使用的服务器(Geronimo 3.0)。大多数人可能会使用Tomcat。这解决了我的问题。希望能对你有所帮助!


3

我今天解决了这个问题。

  • 将输出目录更改为WEB-INF/classes文件夹。(项目/属性/Java构建路径,默认输出文件夹)
  • 分配模块依赖项。(项目/属性/Java EE模块依赖项)它们将被复制到WEB-INF/lib文件夹中,Eclipse也会在那里查找标签库定义。

希望这有所帮助。


谢谢,我不知道模块依赖项设置的事情。 - ryandenki
我的项目属性列表中没有“Java EE模块依赖项”。与Java相关的属性仅为:BeanInfo路径 Java构建路径 Java代码风格 Java编译器 Java编辑器 Javadoc位置是否还有其他选项需要启用? - ryandenki

3
很大程度上取决于项目的类型。WTP的JSP支持要么期望JSP文件在与WEB-INF文件夹的父文件夹(src/web)下(它将把其视为“/”以查找TLD),要么设置项目元数据来帮助它知道根目录在哪里(通过部署组件在动态Web项目中完成)。您是如何引用TLD文件以及JSP文件的位置在哪里?也许我错过了Eclipse论坛上的原始帖子;我看到的那个是在这篇文章发布一整天之后发的。

2

请检查位于F:\apache-tomcat-7.0.21\webapps\examples\WEB-INF\lib的两个库:

  1. jstl.jar
  2. standard.jar

1
这将会是一个更好的答案,具有更一般性的路径,并解释这些库是什么以及它们在其他项目中可以找到的位置。 - user9903

2

我曾经也遇到过同样的问题。 以下是我解决这个问题的步骤。

  1. 选择项目并右键点击。
  2. 点击“属性”。
  3. 点击“库”选项卡。
  4. 点击“添加Jars”。
  5. 添加适用于您错误的相关jar文件。

1
对我来说也是一样,我不知道为什么Maven没有将它放入引用的库中。 - maxivis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接