gpt4 book ai didi

java - Jetty 9.0 绝对uri : http://java. sun.com/jsp/jSTL/core无法解析

转载 作者:搜寻专家 更新时间:2023-10-31 19:33:41 24 4
gpt4 key购买 nike

我在用

  • 嵌入式 Jetty 9。
  • 专家
  • Java 1.7
  • 上海科技大学

当我在 Eclipse 中运行我的应用程序并浏览到我的包含 JSTL 标签的网页时,它工作正常。当我将它捆绑在一个可执行 jar 中并从 cmd 提示符运行时,我得到了

org.apache.jasper.JasperException: /jsp/pcReport.jsp(4,62) PWC6188: 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

我的依赖

    <dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>

<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
<version>9.0.6.v20130930</version>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jsp-2.1-glassfish</artifactId>
<version>2.1.v20100127</version>
</dependency>

我的插件

        <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<mainClass>com.pricemon.server.Main</mainClass>
<classpathPrefix>webapp/WEB-INF/lib/</classpathPrefix>
<addClasspath>true</addClasspath>
</manifest>
<manifestEntries>
<Class-Path>etc/</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptors>
<descriptor>assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>

网络.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">

<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

</web-app>

我的 JSTL jar 位于我的 list 类路径中的 WEB-INF/lib 下

我只是想不通为什么这在 eclipse 下运行时有效,但在从可执行 jar 运行时却不起作用。我也试过在启动时手动添加到类路径但没有效果

java -classpath ./jstl-1.2.jar -jar app.jar

我是否遗漏了一些明显的东西!?

最佳答案

我遇到了同样的问题,但最近没有找到答案。我不得不调试 glassfish 代码来解决它。我希望以下解释可以帮助其他人。

关于依赖项,要使用带有 glassfish 的 JSP 运行,您需要:

<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-jsp</artifactId>
<version>9.2.3.v20140905</version>
</dependency>

<dependency>
<groupId>org.eclipse.jetty.toolchain</groupId>
<artifactId>jetty-jsp-jdt</artifactId>
<version>2.3.3</version>
</dependency>

即使您有 JSLT 1.2 的 jar(可能来自 glassfish 的 javax.servlet.jsp.jSTL.jar),您的嵌入式 Jetty 也无法加载核心的原因是 TldScanner 类包括在 JSP 的 glassfish jar 中。要清楚这个类有一些静态的,比如:

197    static {
198 systemUrisJsf.add("http://java.sun.com/jsf/core");
199 systemUrisJsf.add("http://java.sun.com/jsf/html");
200 systemUris.add("http://java.sun.com/jsp/jstl/core");
201 }

并且由于

中的 block ,它不会在 JAR 中加载 TLD
515    private void mapTldLocation(String resourcePath, TldInfo tldInfo,
516 boolean isLocal) {
517
518 String uri = tldInfo.getUri();
519 if (uri == null) {
520 return;
521 }
522
523 if ((isLocal
524 // Local tld files override the tlds in the jar files,
525 // unless it is in a system jar (except when using myfaces)
526 && mappings.get(uri) == null
527 && !systemUris.contains(uri)
528 && (!systemUrisJsf.contains(uri) || useMyFaces)
529 ) ||
530 (!isLocal
531 // Jars are scanned bottom up, so jars in WEB-INF override
532 // thos in the system (except when using myfaces)
533 && (mappings.get(uri) == null
534 || systemUris.contains(uri)
535 || (systemUrisJsf.contains(uri) && !useMyFaces)
536 )
537 )
538 ) {
...

如果 url 是“http://java.sun.com/jsp/jstl/core”并且存储在本地 jar 中,它就无法加载您的 TLD。要使其成为 NOT LOCAL,应用程序必须由父级包含 JSTL jar 的类加载器加载。简而言之,您需要修改代码以将 WebAppContext 初始化为如下内容:

  ...
WebAppContext webapp = new WebAppContext();

// classURLs may contains URL to WEB-INF/classes or WEB-INF/lib/additional_jar of you web app
URLClassLoader classLoader = new URLClassLoader(classURLs.toArray(new URL[classURLs.size()]),
Thread.currentThread().getContextClassLoader());
webapp.setClassLoader(classLoader);
...
ContextHandlerCollection contextCollection = new ContextHandlerCollection();
contextCollection.addHandler(webapp);
...
Server server = new Server(threadPool);
server.setHandler(contextCollection);
server.start();
...

如果这没有帮助,我想了解您如何将 Jetty 嵌入到您的应用程序中。

关于java - Jetty 9.0 绝对uri : http://java. sun.com/jsp/jSTL/core无法解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19448594/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com