我遇到了类似问题似乎无法解决的问题。
我有一个使用SpringMVC,JSP和taglibs嵌入Jetty的应用程序。我使用maven插件生成jar,将所有依赖的jar捆绑到一个目录中并创建一个清单。
当我使用jar(例如java -jar app.jar)运行应用程序时,一切正常,直到我尝试加载指定<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
或任何其他taglib的JSP。
如果我运行java并在命令行中指定classpath并明确命名我的主类,那么一切正常。我已经验证我的应用程序jar MANIFEST.MF中的Class-Path是正确的。
到目前为止,我已经提出了2种我宁愿避免的解决方法。让我的启动脚本生成类路径并将其放在命令行上。或者,将.tld文件从Jetty jsp-api包中拉出来,并将它们作为常规文件提供,这样我就可以将它们指定为taglibs。
我的理解是贾斯珀应该撕掉所有Jar的所有类路径寻找tld文件?在命令行中指定jar作为类路径的一部分时它可以工作,但是当我的应用程序的jar中指定了类路径时它就会失败。
答案 0 :(得分:3)
找到解决方案。当嵌入Jetty并且不使用它来加载Web应用程序时,有些东西不能用作非标准约定。将tld文件解压缩到src / main / resources / META-INF / tld允许在jar中指定类路径时在运行时找到它们。
答案 1 :(得分:1)
我不确定Jetty的细节以及它应该如何工作,但通常它应该只需将JSTL JAR文件放在webapp的/WEB-INF/lib
文件夹中即可。它在那里吗?
普通的servletcontainer不扫描%CLASSPATH%
环境变量,也不扫描任何JAR中的Class-Path
条目,以搜索特定于webapp的依赖项。相反,它将根据servlet规范加载/WEB-INF/lib
中的所有JAR。
%CLASSPATH%
环境变量默认情况下仅用于执行java
或javac
命令而不使用 {{1 },-cp
和-classpath
个参数。当您使用-jar
参数执行相关JAR时,JAR中的Class-Path
条目仅 。但是整个Web应用程序并不是由-jar
执行的。它由servletcontainer本身根据servlet规范加载和执行。