【问题标题】:Using embedded Jetty using JSP gives error "web-jsptaglibrary_1_2.dtd not found"使用 JSP 使用嵌入式 Jetty 会出现错误“找不到 web-jsptaglibrary_1_2.dtd”
【发布时间】:2012-02-19 15:15:18
【问题描述】:

我正在使用嵌入式 Jetty 来启动一个 web 应用程序,并且我使用 JSP 页面作为视图。

使用 maven-jetty-plugin 可以很好地进行测试,这让我觉得我在引导服务器时缺少一些依赖项(这是问题的根本原因)。

我用命令引导 Jetty:

java $JAVA_OPTS -cp target/classes:target/dependency/* xxx.Main

我在 Maven 中使用了依赖插件,以确保获取类路径上的所有依赖项(在打包的战争文件之外):

<execution>
<id>copy-dep</id>
<goals>
<goal>copy-dependencies</goal>
</goals>
</execution>

Main 类如下所示:

      Server server = new Server(8080);
    WebAppContext root = new WebAppContext();
    root.setContextPath("/");
    root.setWar("target/app.war");
    server.setHandler(root);
    server.start();
    server.join();

嵌入式 Jetty 服务器启动时没有错误,但是当导航到返回 JSP 页面的 URL 时,我总是收到此错误。

堆栈跟踪:

PWC6181: File /javax/servlet/jsp/resources/web-jsptaglibrary_1_2.dtd not found

Caused by:

org.xml.sax.SAXException: PWC6181: File /javax/servlet/jsp/resources/web-jsptaglibrary_1_2.dtd not found
at org.apache.jasper.xmlparser.MyEntityResolver.resolveEntity(ParserUtils.java:566)
at com.sun.org.apache.xerces.internal.util.EntityResolverWrapper.resolveEntity(EntityResolverWrapper.java:107)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.resolveEntityAsPerStax(XMLEntityManager.java:1018)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.dispatch(XMLDocumentScannerImpl.java:1192)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.next(XMLDocumentScannerImpl.java:1090)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:1003)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:235)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284)
at org.apache.jasper.xmlparser.ParserUtils.parseXMLDocument(ParserUtils.java:296)
at org.apache.jasper.xmlparser.ParserUtils.parseXMLDocument(ParserUtils.java:366)
at org.apache.jasper.runtime.TldScanner.scanTld(TldScanner.java:526)
at org.apache.jasper.runtime.TldScanner.scanJar(TldScanner.java:379)
at org.apache.jasper.runtime.TldScanner.scanJars(TldScanner.java:607)
at org.apache.jasper.runtime.TldScanner.scanTlds(TldScanner.java:282)
at org.apache.jasper.runtime.TldScanner.getLocation(TldScanner.java:255)

我使用 Jetty 8,我的 web.xml 配置为 Servlet 3.0。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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_3_0.xsd">

【问题讨论】:

    标签: jsp embedded-jetty


    【解决方案1】:

    我发现缺少 dtd 文件的问题是我需要 Jetty JSP JAR。

    当它不起作用时,我正在使用这些依赖项来支持 JSP:

    <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>jsp-impl</artifactId>
            <version>2.2</version>
        </dependency>
    

    Jetty-runner 一直为我工作,所以我查看了那个 jar 文件中的依赖项。

    <dependency>
        <groupId>org.eclipse.jetty.orbit</groupId>
        <artifactId>javax.servlet.jsp</artifactId>
        <version>2.2.0.v201112011158</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty.orbit</groupId>
        <artifactId>org.apache.jasper.glassfish</artifactId>
        <version>2.2.2.v201112011158</version>
    </dependency>
    

    在 javax.servlet.jsp 依赖项中存在缺失的 dtd 文件,所以当我开始使用它们时问题就消失了。

    所以我猜问题是我需要 Jetty 特定的 JSP 依赖项,而不是一般的依赖项。谁能解释一下为什么 Jetty 是这样实现的?

    【讨论】:

      猜你喜欢
      • 2017-02-09
      • 1970-01-01
      • 2013-04-20
      • 2011-11-19
      • 2014-09-22
      • 1970-01-01
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多