Веб-приложение во встроенном Jetty с ошибкой 404 не найдено

#java #http-status-code-404 #embedded-jetty

#java #http-status-code-404 #встроенный-jetty

Вопрос:

Я хочу развернуть веб-приложение Java Netbeans со встроенным сервером Jetty; сам сервер работает, но я всегда получаю следующую ошибку:

введите описание изображения здесь

Я просмотрел множество примеров в Интернете, настроил и перенастроил свой web.xml ; хотя моя конфигурация кажется прекрасной, я не могу заставить ее работать.

Я должен отметить, что когда я запускаю приложение с помощью Netbeans, используя встроенный сервер Glassfish, оно работает нормально, что говорит мне о том, что web.xml вероятно, он настроен хорошо.

Кто-нибудь может помочь с этим?

Мой код следует.

PS Я знаю, что об этом спрашивали на 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();
    }
}
  

Развертывание.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>
  

Заранее спасибо за помощь!

Комментарии:

1. Может ли дополнительная косая черта в конце URL вызвать эту ошибку? Я вижу, что URL-адрес в браузере заканчивается косой чертой (…/Holmes/), но вы монтируете ресурс без завершающей косой черты: WebAppContext.setContextPath(«/Holmes»)

Ответ №1:

Доступны ли какие-либо журналы трассировки стека?

Без дополнительных журналов я могу только предположить, основываясь на опыте, что это может быть вызвано разрешением каталога, он отлично работал в вашей IDE, поскольку он может находить нужные файлы без каких-либо дополнительных настроек контекста, что может быть не так, когда вы выполняете реальное развертывание.

Ответ №2:

Возможно, шаблон URL неверен, попробуйте изменить на что-то вроде:

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

Ответ №3:

изменить с

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

Для

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

попробуйте это, дайте мне знать

Ответ №4:

Изменить

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

Для

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

Комментарии:

1. Спасибо за ответ, но это не помогло.