IntelliData IntelliData - 2 months ago 18
Java Question

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:

enter image description here

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.

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

Project structure:

enter image description here

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!

Answer

I just realised I ommited a very important line of code:

jettyServer.setHandler(contexts);

Of course it works now...

I just put 50 points to bed for a bounty... oh well :)

Comments