Развертывание файла war в Jetty в Docker: ошибка 404 не найдена, но контексты известны

#java #docker #servlets #jetty #war

#java #docker #сервлеты #jetty #Война

Вопрос:

Здесь я просматриваю руководство по Hello World для Jetty

Согласно руководству, я должен иметь возможность получить к нему доступ по адресу: 8080 / hello-world / hello (hello-world исходит из идентификатора артефакта в pom.xml и привет приходит от web.xml ). Когда я пытаюсь это сделать, я получаю HTTP-ошибку 404.

Когда я пытаюсь получить доступ к веб-серверу по адресу http://172.17.0.2:8080 / (172.17.0.2 — ip-адрес контейнера) Я получаю следующую отображаемую информацию:

 Error 404 - Not Found.
No context on this server matched or handled this request.
Contexts known to this server are:

 - /hello-world-0.1-SNAPSHOT ---> o.e.j.w.WebAppContext@3224f60b{hello-world-0.1-SNAPSHOT,/hello-world-0.1-SNAPSHOT,file:///tmp/jetty-0.0.0.0-8080-hello-world-0.1-SNAPSHOT.war-_hello-world-0.1-SNAPSHOT-any-4591378293374546697.dir/webapp/,AVAILABLE}{/hello-world-0.1-SNAPSHOT.war}


  

Мой файл Dockerfile:

 
FROM openjdk:10 as step-one                                                                                                 

COPY ./ /var/www/java/
WORKDIR /var/www/java

RUN apt-get update -y amp;amp; apt-get install -y maven

RUN mvn clean package -X

FROM jetty as step-two

COPY --from=step-one /var/www/java/target/hello-world-0.1-SNAPSHOT.war /var/lib/jetty/webapps/

ENTRYPOINT ["java"]
CMD ["-jar", "/usr/local/jetty/start.jar", "--create-startd=jmx, stats"]

EXPOSE 8080


  

Мой web.xml:

 <?xml version="1.0" encoding="ISO-8859-1"?>                                                                                 
<web-app 
   xmlns="http://java.sun.com/xml/ns/javaee" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
   version="2.5">
  <servlet>
    <servlet-name>Hello</servlet-name>
    <servlet-class>org.example.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Hello</servlet-name>
    <url-pattern>/hello/*</url-pattern>
  </servlet-mapping>
</web-app>
  

pom.xml:

 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <groupId>org.example</groupId>
  <artifactId>hello-world</artifactId>
  <version>0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <name>Jetty HelloWorld</name>

  <properties>
    <jettyVersion>7.2.0.v20101020</jettyVersion>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-server</artifactId>
      <version>${jettyVersion}</version>
    </dependency>
  </dependencies>

  <build>
      <plugins>


          <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>


      <plugin>
        <!-- This plugin is needed for the servlet example -->
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>${jettyVersion}</version>
      </plugin>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.1</version>
        <executions>
          <execution><goals><goal>java</goal></goals></execution>
        </executions>
        <configuration>
          <mainClass>org.example.HelloWorld</mainClass>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

  

HelloServlet.java:

 
package org.example;                                                                                                        

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet
{
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {   
        response.setContentType("text/html");
        response.setStatus(HttpServletResponse.SC_OK);
        response.getWriter().println("<h1>Hello Servlet</h1>");
        response.getWriter().println("session="   request.getSession(true).getId());
    }   
}
  

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

1. На первый взгляд, я немного смущен тем, что вы используете базовый образ jetty (т.Е. без тега latest ), который содержит Jetty 9.x, но обратитесь к документации Jetty 7 и используйте Jetty 7 в вашем POM. Даже если это не источник проблемы, вы должны быть осторожны с версиями…

2. Спасибо, что обратили на это мое внимание. Причина, по которой я использую его без тега, заключается в том, что именно так они используют его в документации к изображению jetty: github.com/docker-library/docs/tree/master/jetty

3. Я думаю, что причина этого в том, что Jetty 7 и 8 слишком старые и находятся в состоянии EOL ( eclipse.org/jetty/previousversions.html ). Также обратите внимание, что в документации из вашего поста этот факт также указывается и предоставляется ссылка на обновленный учебник по Jetty 9: eclipse.org/jetty/documentation/current /…

4. В этом и заключалась проблема. Пути к контексту отличаются в более новых версиях. Мне пришлось перейти к: 8080 / hello-world-0.1-SNAPSHOT / hello, чтобы получить к нему доступ.