简体   繁体   中英

Webapplication in Embedded Jetty getting Error 404 Not found

I want to deploy a Java Netbeans Webapp with an embedded Jetty Server; the server itself works, but I always get the following error:

在此处输入图片说明

I searched through mounds of examples on the web, configured & reconfigured my web.xml; although my configuration seems fine, I can't get it to work.

I should point out, that when I run the app from whithin Netbeans using the built-in Glassfish server, it works fine, which tells me that web.xml is probably configured well.

Can anyone help with this?

My code follows.

PS I know that it's been asked on SO, but those examples did not work for me either.

Project structure:

在此处输入图片说明

WebContext setup:

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 (main method) :

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>

Thanks in advance for the help!

change from 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;
 }
}

to

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;
  }
}

try this one let me know

Is there any stack trace logs available?

Without more logs, I can only imagine based on experience that it may be caused by directory resolving, it worked fine in your IDE since it can find the proper files without any further context configuration staff ,which may be not the case when you carry out a real deployment.

Maybe the url-pattern is wrong, try to change to something like:

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

Change

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

to

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM