当前位置: 首页 > 知识库问答 >
问题:

如何使嵌入式Jetty9成功解析JSTL URI?

贝嘉泽
2023-03-14

我正在打包一个Web应用程序存档(.war),以便通过java-jar webapp.war在shell中启动它,方法是在主类中使用以下代码启动Jetty 9的嵌入式副本:

int port = Integer.parseInt(System.getProperty("port", "80")); // I know this has implications :)
String contextPath = System.getProperty("contextPath", "");
Server server = new Server(port);
ProtectionDomain domain = Deployer.class.getProtectionDomain();
URL location = domain.getCodeSource().getLocation();
WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/" + contextPath);
webapp.setWar(location.toExternalForm());
server.setHandler(webapp);
server.start();
server.join();

但是,当编译第一个包含JSTL taglib声明的JSP时,我遇到了这个错误:

org.apache.jasper.JasperException: /WEB-INF/html/user/login.jsp(2,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
at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:92)
at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:378)
at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:172)
at org.apache.jasper.compiler.TagLibraryInfoImpl.generateTLDLocation(TagLibraryInfoImpl.java:431)
at org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:240)
at org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:502)
at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:582)
at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1652)
at org.apache.jasper.compiler.Parser.parse(Parser.java:185)
at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:244)
at org.apache.jasper.compiler.ParserController.parse(ParserController.java:145)
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:212)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:451)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:625)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:698)
etc...
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" isELIgnored="false" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    null

如果有任何想法或建议,我将不胜感激。此设置将取代旧的设置,旧的设置在Windows上成功地完成了相同的任务,但由于包含了带来此bug的旧依赖项,因此在Linux上无法运行。不幸的是,我无法找到一个快速替代该依赖关系的工具(groupIdorg.mortbay.jettyartifactIdJSP-2.1-Glassfishversion2.1.v20100127),它没有引入上面提到的JSTL URI堆栈跟踪。

更新:我找到了一个次优的解决方案。受此启发,降级到Jetty7现在让我开始运行。这是个好消息,但令人沮丧的是,如果我以后需要Jetty8或Jetty9独有的任何功能,我就不得不放弃这个部署基础结构。对于Jetty9中JSTL taglib问题的任何见解都将不胜感激。

共有1个答案

令狐宜民
2023-03-14

这里还有另一个解决方案。我也遇到了非常相似的问题,只有一个单独的war文件和一个简单的嵌入器类,它为我创建了一个Jetty服务器,并启动它,可能指向任何war文件。这是如何工作的。

>

  • war文件在WEB-INF/lib中没有任何tld库,并且与loader miniApplication完全分离。

    启动服务器并将其指向任何war文件的Loader应用程序Main类具有以下依赖项(maven):

        <!-- Jetty webapp -->
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-webapp</artifactId>
            <version>${jettyVersion}</version>
        </dependency>
    
        <!-- With JSP support -->
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-jsp</artifactId>
            <version>${jettyVersion}</version>
        </dependency>
    
    Server server = new Server(cncPort);
    
    WebAppContext webApp = new WebAppContext();
    
    webApp.setContextPath(applicationContext);
    webApp.setWar(jettyHome + "/" + warFile);
    server.setHandler(webApp);
    
    try {
        server.start();
        server.join();
    } catch (Exception ex) {
        System.out.println("Failed to start server.");
        ex.printStackTrace();
    } 
    
    + EmbedderApp
    |
    +-- lib
      - EmbeddedApp.jar <-- JAR with the embedder class
      - com.sun.el-2.2.0.v201303151357.jar
      - javax.el-2.2.0.v201303151357.jar
      - javax.servlet-3.0.0.v201112011016.jar
      - javax.servlet.jsp-2.2.0.v201112011158.jar
      - javax.servlet.jsp.jstl-1.2.0.v201105211821.jar
      - jetty-http-9.0.6.v20130930.jar
      - jetty-io-9.0.6.v20130930.jar
      - jetty-jsp-9.0.6.v20130930.jar
      - jetty-security-9.0.6.v20130930.jar
      - jetty-server-9.0.6.v20130930.jar
      - jetty-servlet-9.0.6.v20130930.jar
      - jetty-util-9.0.6.v20130930.jar
      - jetty-webapp-9.0.6.v20130930.jar
      - jetty-xml-9.0.6.v20130930.jar
      - org.apache.jasper.glassfish-2.2.2.v201112011158.jar
      - org.apache.taglibs.standard.glassfish-1.2.0.v201112081803.jar
      - org.eclipse.jdt.core-3.8.2.v20130121.jar
    
    <dependencySet>
        <outputDirectory>lib</outputDirectory>
        <scope>runtime</scope>
    </dependencySet>
    
    for jar in ${APP_ROOT}/lib/*.jar; do CLASSPATH=$jar:${CLASSPATH}; done 
    

    希望这能节省一些人的时间:-)

  •  类似资料:
    • 问题内容: 我想解析这个XML文件: 要解析的XML文件: 我想将要点名称和方案返回给我。因此,对于示例文件,我想要AbsoluteValue和场景列表(CALCULATED和INPUT_IS_BLANK)。如果我错了,请纠正我,但是要使用的数据结构是 如何在Java代码中完成此操作?如果可能的话,我想使用XPATH。 我以为这是获取每个SCENARIO的正确XPATH表达式? 问题答案: 感谢M

    • 问题内容: 我实质上是试图浏览html文件的文件夹。我想将它们嵌入到二进制文件中,并能够根据请求解析它们以用于模板执行目的。(如果我的措词不正确,请原谅)。 任何想法,技巧,窍门或实现此目的的更好方法将不胜感激。 问题答案: 我使用大多数Go Web应用程序执行此操作。我使用go-bindata从要嵌入的所有文件中自动生成Go源代码,然后将其编译为二进制文件。所有这些都是在构建过程中自动完成的。

    • 我有一个简单的java项目,叫做服务器。此外,我有一个osgi api项目,它定义了一个接口BlockProvider。接下来,我有一个osgi声明性服务项目,其中有一个实现BlockProvider的服务。 在我的java项目服务器中,我有一个嵌入式osgi框架(在我的例子中是felix)。 我创建了一个bundleactivator,它安装gogo osgi捆绑包、scr捆绑包、我的api项目

    • 我收到了来自Kafka的JSON字符串,需要由PySpark处理。字符串如下所示: 我的计划是将字符串分成JSON字段。为此,我定义了以下模式: 但是,使用此架构会导致以下错误: 但是,如果我使用没有嵌套字段的模式(如下所示),我可以解析: 我的目标是得到这样的输出: 我想在这方面得到一些帮助。现在我可以得到除嵌套结构之外的所有字段。 我使用的模式如下: Adam提到的模式适用于这个特定的字符串。

    • 问题内容: 我想制作一个桌面应用程序来浏览一个网站,我不想制作一个浏览器,而是一个浏览器嵌入的应用程序。我尝试过,但是发现了一些问题,例如缺少对插件的支持(例如:Flash,pdf查看器等)。 经过大量搜索后,我发现了Chromium嵌入式框架(CEF)或JCEF Java包装器,但我不知道如何在Java中使用它。 是否可以在Java应用程序中嵌入CEF / JCEF? 问题答案: 是否可以在Ja

    • 这是我的示例html代码。 使用HtmlXpath Selector我需要解析html文件。 def parse(自己,响应):edxData=HtmlXpath Selector(响应) 首先,我需要获取所有包含 edxData.xpath 的标记('//h2[@class = “标题课程-标题”]') 在该标签内,我需要检查标签值。 然后需要解析带有类名字幕课程 - 字幕复制 - 详细信息的d