当 jar 中指定类路径时,嵌入式 Jetty 无法加载 JSP 标记库
我遇到了一个类似问题似乎无法解决的问题。
我有一个嵌入 Jetty 的应用程序,使用 SpringMVC、JSP 和 taglib。我使用 Maven 插件生成一个 jar,将所有依赖的 jar 捆绑到一个目录中并创建一个清单。
当我使用 jar (例如 java -jar app.jar)运行应用程序时,一切正常,直到我尝试加载指定 <%@ taglib uri="http://java.sun.com 的 JSP /jsp/jstl/core" prefix="c"%>
或任何其他与此相关的标签库。
如果我运行 java 并在命令行上指定类路径并明确命名我的主类,那么一切都会起作用。我已经验证我的应用程序 jar MANIFEST.MF 中的类路径是正确的。
到目前为止,我已经想出了两种我宁愿避免的解决方法。让我的启动脚本生成类路径并将其放在命令行上。或者,将 .tld 文件从 Jetty jsp-api 包中取出,并将它们作为常规文件提供,这样我就可以将它们指定为标记库。
我的理解是 Jasper 应该遍历所有 Jar 的所有类路径来寻找 tld 文件?当在命令行上指定 jar 作为类路径的一部分时,它可以工作,但是当在我的应用程序的 jar 中指定类路径时,它会失败。
I'm running into a problem that doesn't seem to be addressed by the similar questions.
I have an app that embeds Jetty, using SpringMVC, JSPs and taglibs. I use a maven plugin to generate a jar, bundle all the dependent jars into a directory and create a manifest.
When I run the app using the jar (eg. java -jar app.jar) everything works fine until I try to load a JSP that specifies <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
or any other taglib for that matter.
If I run java and specify the classpath on the command line and name my main class explicitly it all works. I've verified that the Class-Path inside my apps jar MANIFEST.MF is correct.
So far I've come up with 2 work-arounds that I would rather avoid. Have my launch script generate the classpath and put it on the command line. Or, pull the .tld files out of the Jetty jsp-api package and make them available as regular files which allows me to specify them as taglibs.
My understanding is that Jasper is supposed to tear through all Jar's all the classpath looking for tld files? When specifying the jars on the command line as part of the classpath it works, but when the class path is specified in my app's jar it fails.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我不确定 Jetty 的具体情况以及它应该如何工作,但是通常只需将 JSTL JAR 文件放入
/WEB-INF/lib
中就足够了webapp 的文件夹。在那里吗?普通 servlet 容器不会扫描
%CLASSPATH%
环境变量,也不会扫描任何 JAR 中的Class-Path
条目来搜索特定于 Web 应用程序的依赖项。相反,它只会根据 servlet 规范加载/WEB-INF/lib
中的所有 JAR。默认情况下,
%CLASSPATH%
环境变量仅在执行java
或javac
命令时使用-cp
、-classpath
和-jar
参数。 JAR 中的Class-Path
条目仅在您使用-jar
参数执行相关JAR 时使用。但整个 Web 应用程序并不是由java -jar
执行的。它由 servlet 容器本身根据 servlet 规范加载和执行。I'm not sure about the specifics of Jetty and how it is supposed to work, but normally it should suffice to just drop JSTL JAR file in
/WEB-INF/lib
folder of the webapp. Is it there?A normal servletcontainer doesn't scan the
%CLASSPATH%
environment variable nor theClass-Path
entry in any of the JARs to search for webapp-specific dependencies. Instead, it will just load all JARs in the/WEB-INF/lib
according the servlet spec.The
%CLASSPATH%
environment variable is by default only used when you executejava
orjavac
command without the-cp
,-classpath
and-jar
arguments. TheClass-Path
entry in JAR is only used when you execute the JAR in question using-jar
argument. But the webapp at its whole own isn't executed byjava -jar
. It's loaded and executed by the servletcontainer itself according the servlet spec.找到了解决方案。事实证明,当嵌入 Jetty 并且不使用它来加载 Web 应用程序时,有些事情就无法工作,因为它不符合标准约定。将 tld 文件提取到 src/main/resources/META-INF/tld 允许在运行时在 jar 中指定类路径时找到它们。
Found the solution. Turns out when embedding Jetty, and not using it to load a web application, some things just don't work as its not standard convention. Extracting the tld files into src/main/resources/META-INF/tld allowed them to be found at runtime when the class path is specified in the jar.