嵌入式 Jetty 中的 Web 应用程序出现错误 404 未找到

Posted

技术标签:

【中文标题】嵌入式 Jetty 中的 Web 应用程序出现错误 404 未找到【英文标题】:Webapplication in Embedded Jetty getting Error 404 Not found 【发布时间】:2017-02-09 07:20:14 【问题描述】:

我想部署一个带有嵌入式 Jetty 服务器的 Java Netbeans Webapp;服务器本身可以工作,但我总是收到以下错误:

我在网上搜索了大量示例,配置并重新配置了我的 web.xml;虽然我的配置看起来不错,但我无法让它工作。

我应该指出,当我使用内置 Glassfish 服务器从 Netbeans 运行应用程序时,它运行良好,这告诉我 web.xml 可能配置良好。

有人可以帮忙吗?

我的代码如下。

P.S.我知道有人在 SO 上问过这个问题,但这些例子对我也不起作用。

项目结构:

WebContext 设置:

import org.eclipse.jetty.webapp.WebAppContext;

public class AppContextBuilder 

    private WebAppContext webAppContext;

    public WebAppContext buildWebAppContext() 
        webAppContext = new WebAppContext();
        webAppContext.setDescriptor(webAppContext + "/WEB-INF/web.xml");
        webAppContext.setResourceBase("src/main/webapp");
        webAppContext.setContextPath("/Holmes");

        return webAppContext;
    

JettyServer.java:

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;

public class JettyServer 

    private Server server;

    public JettyServer() 
        this(8585);
    

    public JettyServer(Integer runningPort) 
        server = new Server(runningPort);
    

    public void setHandler(ContextHandlerCollection contexts) 
        server.setHandler(contexts);
    

    public void start() throws Exception 
        server.start();
    

    public void stop() throws Exception 
        server.stop();
        server.join();
    

    public boolean isStarted() 
        return server.isStarted();
    

    public boolean isStopped() 
        return server.isStopped();
    

Deploy.java(主要方法)

import org.apache.log4j.Logger;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;

/**
 *
 * @author Motty Waldner <motty@timeworksny.com>
 */

public class Deploy 

    private final static Logger log = Logger.getLogger(Deploy.class);

    static JettyServer jettyServer = new JettyServer();

    public static void main(String[] args) throws Exception 
        // add hook to stop server upon service termination
        // (service calls System.exit(0) upon termination,
        // so it should work under normal circumstances)
        addShutdownHook();

        ContextHandlerCollection contexts = new ContextHandlerCollection();
        Handler[] handlers = new Handler[]new AppContextBuilder().buildWebAppContext().getHandler();
        contexts.setHandlers(handlers);

        jettyServer = new JettyServer();

        try 
            jettyServer.start();
         catch (Exception e) 
            log.error("Error Starting Jetty Server", e);
        
    

    private static void addShutdownHook() 
        Runtime.getRuntime().addShutdownHook(new Thread() 
            @Override
            public void run() 
                try 
                    jettyServer.stop();
                    log.info("Shutdown Hook is running: Jetty Server instance being stopped.");
                 catch (Exception e) 
                    log.error("error", e);
                

                log.info("Application Terminating ...");
            
        );
    

Web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>Test App</display-name>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <filter>
        <filter-name> struts2 </filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
        </filter-class>
    </filter>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
    
    <session-config>  
        <session-timeout>120</session-timeout>  
    </session-config>
  
    <servlet-mapping>
        <servlet-name>StrutsController</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>
 
</web-app>

提前感谢您的帮助!

【问题讨论】:

URL 末尾多余的斜杠会不会导致这个错误?我看到浏览器中的 URL 以斜杠 (.../Holmes/) 结尾,但您安装的资源没有尾部斜杠:webAppContext.setContextPath("/Holmes") 【参考方案1】:

从 公共类 AppContextBuilder

private WebAppContext webAppContext;

public WebAppContext buildWebAppContext() 
    webAppContext = new WebAppContext();
    webAppContext.setDescriptor(webAppContext + "/WEB-INF/web.xml");
    webAppContext.setResourceBase("src/main/webapp");
    webAppContext.setContextPath("/Holmes");

    return webAppContext;
 

public class AppContextBuilder 

private WebAppContext webAppContext;

public WebAppContext buildWebAppContext() 
    webAppContext = new WebAppContext();
    webAppContext.setDescriptor(webAppContext + "/WEB-INF/web.xml");
    webAppContext.setResourceBase(webAppContext);
    webAppContext.setContextPath("/Holmes");

    return webAppContext;
  

试试这个让我知道

【讨论】:

【参考方案2】:

是否有可用的堆栈跟踪日志?

如果没有更多日志,我只能根据经验想象它可能是由目录解析引起的,它在您的 IDE 中运行良好,因为它可以在没有任何进一步的上下文配置人员的情况下找到正确的文件,而当你进行真正的部署。

【讨论】:

【参考方案3】:

可能是 url-pattern 有问题,试试改成这样的:

    <servlet-mapping>
       <servlet-name>StrutsController</servlet-name>
       <url-pattern>*</url-pattern>
    </servlet-mapping>

【讨论】:

【参考方案4】:

改变

Handler[] handlers = new Handler[]new AppContextBuilder().buildWebAppContext().getHandler();

Handler[] handlers = new Handler[]new AppContextBuilder().buildWebAppContext();

【讨论】:

感谢您的回答,但这并没有帮助。

以上是关于嵌入式 Jetty 中的 Web 应用程序出现错误 404 未找到的主要内容,如果未能解决你的问题,请参考以下文章

Jetty 中的 JSR-356 javax websockets(嵌入式和非嵌入式)

Jetty嵌入式Web容器攻略

Jetty Websocket 服务器在本地工作,但远程连接失败并出现“主机已关闭”错误,如何解决?

带有 Spring Boot 应用程序的 Jetty 9.4.21 出现 TypeCast 错误

在嵌入式 Jetty Web 容器内运行 OSGi 容器。可能的?

如何配置嵌入式 Jetty 以处理 OPTIONS 预检请求?