Развертывание службы Java REST на док-станции Tomcat - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь развернуть простую службу REST на tomcat, работающем в докере, но не могу соединиться, чтобы добраться до службы, которую я пытался развернуть.

Простая служба, которую ясоздал в этом классе:

@Path("/test")
public class RestTest {

    public static final String JSON_RPC = "2.0";

    @GET
    @Path("/hello")
    @Produces(MediaType.APPLICATION_JSON)
    public Response processHelloRequestGet() {
        String answer = "Hello There!";
        JsonRpcResponse rpcResponse = new JsonRpcResponse();
        rpcResponse.setId("42");
        rpcResponse.setJsonRpc(JSON_RPC);
        rpcResponse.setResult(answer);
        return Response.status(Status.OK).entity(rpcResponse).build();
    }
}

Он просто создает простой статический ответ в форме ответа JSON-RPC.

Мой web.xml выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

    <display-name>REST Test</display-name>

    <servlet>
        <servlet-name>jerseyServlet</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>net.jfabricationgames.rest_test</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>jerseyServlet</servlet-name>
        <url-pattern>/rest/*</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>net.jfabricationgames.rest_test</groupId>
    <artifactId>RestTest</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>RestTest Maven Webapp</name>
    <url>http://maven.apache.org</url>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- JAX-RS for REST -->
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.1-m07</version><!-- <version>2.0</version> -->
        </dependency>

        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-jdk-http</artifactId>
            <version>2.26</version><!-- <version>2.10.1</version> -->
        </dependency>

        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet</artifactId>
            <version>2.26</version><!-- <version>2.10.1</version> -->
        </dependency>

        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <version>2.26</version><!-- <version>2.10.1</version> -->
        </dependency>

        <dependency>
            <groupId>org.glassfish.jersey.inject</groupId>
            <artifactId>jersey-hk2</artifactId>
            <version>2.26</version>
        </dependency>

        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>

        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-json</artifactId>
            <version>1.18.1</version>
        </dependency>
        <dependency>
            <groupId>com.owlike</groupId>
            <artifactId>genson</artifactId>
            <version>0.99</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/asm/asm -->
        <dependency>
            <groupId>asm</groupId>
            <artifactId>asm</artifactId>
            <version>3.3.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-bundle -->
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-bundle</artifactId>
            <version>1.19.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.json/json -->
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20160810</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-server -->
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-server</artifactId>
            <version>1.19.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-core -->
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-core</artifactId>
            <version>1.19.2</version>
        </dependency>

    </dependencies>
    <build>
        <finalName>RestTest</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <path>/rest_test</path>
                    <port>8080</port>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Теперь, если я запускаю проект на Tomcatсервер из затмения все работает так, как ожидалось (с использованием конфигурации запуска Base directory: ${workspace_loc:/RestTest} и Goals: tomcat7:run), и я могу обратиться к службе, используя URL http://localhost:8080/rest_test/rest/test/hello.

Проблема теперь в том, что я хочу, чтобы моя служба работала на tomcat внутри докера на сервере, который, похоже, не работает.

То, что я пробовал до сих пор экспортирует проект в файл .war (используя maven (gloals: clean install compile) или функцию экспорта eclipse), помещает их в каталог, из которого я строю файл docker, создаю файл docker и запускаю его.

Используемый Dockerfile (следующий этот урок ) выглядит следующим образом:

FROM tomcat:8.0-alpine
LABEL maintainer="deepak@softwareyoga.com"

ADD rest_test.war /usr/local/tomcat/webapps/

EXPOSE 8080
CMD ["catalina.sh", "run"]

При запуске контейнера Docker с помощью команды docker run -p 80:8080 mywebapp я получаюследующий вывод (который мне кажется правильным):

docker run -p 80:8080 mywebapp
21-Oct-2019 16:49:55.404 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version:        Apache Tomcat/8.0.53
21-Oct-2019 16:49:55.407 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Jun 29 2018 14:42:45 UTC
21-Oct-2019 16:49:55.408 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server number:         8.0.53.0
21-Oct-2019 16:49:55.408 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
21-Oct-2019 16:49:55.408 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            5.0.0-31-generic
21-Oct-2019 16:49:55.409 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
21-Oct-2019 16:49:55.409 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /usr/lib/jvm/java-1.7-openjdk/jre
21-Oct-2019 16:49:55.409 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           1.7.0_181-b01
21-Oct-2019 16:49:55.410 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Oracle Corporation
21-Oct-2019 16:49:55.410 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         /usr/local/tomcat
21-Oct-2019 16:49:55.411 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         /usr/local/tomcat
21-Oct-2019 16:49:55.411 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties
21-Oct-2019 16:49:55.412 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
21-Oct-2019 16:49:55.412 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
21-Oct-2019 16:49:55.412 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
21-Oct-2019 16:49:55.413 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dignore.endorsed.dirs=
21-Oct-2019 16:49:55.413 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/usr/local/tomcat
21-Oct-2019 16:49:55.413 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/usr/local/tomcat
21-Oct-2019 16:49:55.414 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp
21-Oct-2019 16:49:55.414 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded APR based Apache Tomcat Native library 1.2.17 using APR version 1.6.3.
21-Oct-2019 16:49:55.414 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
21-Oct-2019 16:49:55.418 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized (OpenSSL 1.0.2o  27 Mar 2018)
21-Oct-2019 16:49:55.528 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-apr-8080"]
21-Oct-2019 16:49:55.556 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["ajp-apr-8009"]
21-Oct-2019 16:49:55.561 INFO [main] org.apache.catalina.startup.Catalina.load Initialization processed in 1095 ms
21-Oct-2019 16:49:55.677 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service Catalina
21-Oct-2019 16:49:55.677 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.0.53
21-Oct-2019 16:49:55.760 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive /usr/local/tomcat/webapps/rest_test.war
21-Oct-2019 16:49:56.810 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive /usr/local/tomcat/webapps/rest_test.war has finished in 1,050 ms
21-Oct-2019 16:49:56.820 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive /usr/local/tomcat/webapps/sample.war
21-Oct-2019 16:49:56.911 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive /usr/local/tomcat/webapps/sample.war has finished in 91 ms
21-Oct-2019 16:49:56.913 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /usr/local/tomcat/webapps/docs
21-Oct-2019 16:49:56.986 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /usr/local/tomcat/webapps/docs has finished in 73 ms
21-Oct-2019 16:49:56.992 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /usr/local/tomcat/webapps/examples
21-Oct-2019 16:49:57.799 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /usr/local/tomcat/webapps/examples has finished in 807 ms
21-Oct-2019 16:49:57.801 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /usr/local/tomcat/webapps/ROOT
21-Oct-2019 16:49:57.882 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /usr/local/tomcat/webapps/ROOT has finished in 82 ms
21-Oct-2019 16:49:57.885 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /usr/local/tomcat/webapps/manager
21-Oct-2019 16:49:57.984 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /usr/local/tomcat/webapps/manager has finished in 99 ms
21-Oct-2019 16:49:57.993 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /usr/local/tomcat/webapps/host-manager
21-Oct-2019 16:49:58.081 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /usr/local/tomcat/webapps/host-manager has finished in 88 ms
21-Oct-2019 16:49:58.088 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-apr-8080"]
21-Oct-2019 16:49:58.156 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-apr-8009"]
21-Oct-2019 16:49:58.187 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 2625 ms

Что яДо сих пор работает так, что док-контейнер, кажется, запущен правильно, и я могу открыть домашнюю страницу tomcat, введя localhost в браузер (см. рисунок ниже). Также мой файл .war, кажется, добавлен и извлечен правильно (есть файл rest_test.war и каталог rest_test в каталоге webapps контейнера настройки tomcat). Также все работает очень хорошо, когда запускается из затмения.

Tomcat 'homepage' is reachable

То, что пока не работает - это достичь остальныхСервис я создал и развернул. Я пытался получить к нему доступ с помощью URL localhost/rest_test/rest/test/hello, но получаю ошибку HTTP 404 - Not Found.

Что странно в том, что я не получаю сообщение в HTTPошибка 404 при вызове URL localhost/rest_test/rest/..., но я получаю сообщение при вызове любого другого URL (как показано на рисунках ниже), что заставляет меня думать, что это не совсем неправильно, что я пытаюсь.

The 'assumed correct' url doesn't contain a message in the HTTP error 404

A wrong URL seems to contain a message in the http 404 error

Заранее спасибо.

РЕДАКТИРОВАТЬ : Обновленок коту 9, используя образ докера tomcat:9.0-alpine, но это, похоже, ничего не изменило. Содержимое файла .war выглядит следующим образом:

enter image description here

1 Ответ

1 голос
/ 23 октября 2019

Кажется, что файл войны построен неправильно. Каталог WEB-INF/libs, содержащий зависимости приложения jar, отсутствует. Подробнее о каталоге Макет файла архива веб-приложения здесь .

Исключения, возникающие при запуске, регистрируются в /usr/local/tomcat/logs/localhost.<timestamp>.log. Вот почему все, кажется, работает нормально. localhost.log должен содержать ошибку:

java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Как уже упоминалось в комментариях, джерси 2.26 не может работать с Java 1.7.0_181. Поскольку библиотеки не загружаются во время запуска приложения, в выходных данных нет ошибок несовместимости версий Java.

Теперь, предположим, что вы работаете с tomcat 9 и java 8, первым шагом является исправление сборки. Я предлагаю запустить Maven из командной строки. Ваш pom.xml выглядит просто отлично, и он должен создать действительную войну.

Следующим шагом является установка области действия библиотеки javax.ws.rs-api. В библиотеке jersey-bundle есть немного другая версия классов javax.ws.rs, и если вы сохраните оба, вы можете столкнуться с проблемами загрузки классов.

 <dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.1</version>
    <scope>provided</scope>
</dependency>

Это исправит проблемы, но конфигурация все еще имеет проблемы, потому что высмешивание Джерси 1.x с библиотеками Джерси 2.x. Кроме того, трикотажный комплект не следует использовать с Maven. Пакет предназначен только для разработчиков, которые не используют систему зависимостей Maven.

Базовая конфигурация зависимостей с использованием библиотек jersey 2 должна выглядеть следующим образом:

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>

    <jersey2.version>2.26</jersey2.version>
    <jaxrs.version>2.1.1</jaxrs.version>
  </properties>
  <dependencies>
    <!-- JAX-RS -->
    <dependency>
      <groupId>javax.ws.rs</groupId>
      <artifactId>javax.ws.rs-api</artifactId>
      <version>${jaxrs.version}</version>
    </dependency>
    <!-- Jersey -->
    <dependency>
      <groupId>org.glassfish.jersey.containers</groupId>
      <artifactId>jersey-container-servlet</artifactId>
      <version>${jersey2.version}</version>
    </dependency>
    <dependency>
      <groupId>org.glassfish.jersey.core</groupId>
      <artifactId>jersey-server</artifactId>
      <version>${jersey2.version}</version>
    </dependency>
    <dependency>
      <groupId>org.glassfish.jersey.core</groupId>
      <artifactId>jersey-client</artifactId>
      <version>${jersey2.version}</version>
    </dependency>
    <dependency>
      <groupId>org.glassfish.jersey.media</groupId>
      <artifactId>jersey-media-json-jackson</artifactId>
      <version>${jersey2.version}</version>
    </dependency>
    <dependency>
      <groupId>org.glassfish.jersey.inject</groupId>
      <artifactId>jersey-hk2</artifactId>
      <version>${jersey2.version}</version>
    </dependency>
  </dependencies>

web.xml тоже нужно изменить:

<servlet>
        <servlet-name>jersey-serlvet</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
             <param-name>jersey.config.server.provider.packages</param-name>
             <param-value>net.jfabricationgames.rest_test</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>jersey-serlvet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...