2

我遇到了类似问题似乎无法解决的问题。

我有一个使用 SpringMVC、JSP 和 taglibs 嵌入 Jetty 的应用程序。我使用一个 maven 插件来生成一个 jar,将所有依赖的 jar 捆绑到一个目录中并创建一个清单。

当我使用 jar(例如 java -jar app.jar)运行应用程序时,一切正常,直到我尝试加载指定的 JSP<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>或任何其他 taglib。

如果我运行 java 并在命令行上指定类路径并明确命名我的主类,则一切正常。我已经验证了我的应用程序 jar MANIFEST.MF 中的 Class-Path 是正确的。

到目前为止,我已经提出了两种我宁愿避免的解决方法。让我的启动脚本生成类路径并将其放在命令行上。或者,将 .tld 文件从 Jetty jsp-api 包中提取出来,并将它们作为常规文件提供,这样我就可以将它们指定为标记库。

我的理解是,Jasper 应该通过所有 Jar 的所有类路径来寻找 tld 文件?在命令行上将 jar 指定为类路径的一部分时,它可以工作,但是当在我的应用程序的 jar 中指定类路径时,它会失败。

4

2 回答 2

3

找到了解决方案。事实证明,当嵌入 Jetty,而不是使用它来加载 Web 应用程序时,有些事情不能作为它的非标准约定工作。当在 jar 中指定类路径时,将 tld 文件提取到 src/main/resources/META-INF/tld 允许在运行时找到它们。

于 2011-05-17T20:52:50.273 回答
1

我不确定 Jetty 的细节以及它应该如何工作,但通常只需将 JSTL JAR 文件放到/WEB-INF/libwebapp 的文件夹中就足够了。它在那里吗?

普通的 servlet 容器不会扫描%CLASSPATH%环境变量或Class-Path任何 JAR 中的条目来搜索特定于 webapp 的依赖项。相反,它只会/WEB-INF/lib根据 servlet 规范加载所有 JAR。

%CLASSPATH%默认情况下,环境变量仅您执行java,和参数的javac命令时使用。JAR 中的条目在您使用参数执行相关 JAR 时使用。但是 webapp 本身并不是由. 它由 servletcontainer 本身根据 servlet 规范加载和执行。-cp-classpath-jarClass-Path-jarjava -jar

于 2011-05-16T17:48:53.590 回答