Jersey Web 应用程序的 Docker 镜像

Scyla101

我正在尝试从在 Tomcat 服务器上运行的 Jersey Web 应用程序创建 Docker 映像。我正在 Windows 7 机器上开发。

我已经在我的开发机器上的本地 Tomcat 8.0.14 应用程序服务器上部署了 Web 应用程序,一切都按预期工作。

为了创建 Docker 映像,我将以下内容Dockerfile.放在与my-web-app.war文件相同的目录中

FROM tomcat:8.0-jre8
ADD /my-web-app.war /usr/local/tomcat/webapps/
CMD ["catalina.sh", "run"]

之后,我使用以下命令创建图像:

docker build -t my-web-app .

这已成功完成,图像随docker images -a命令一起显示

之后,我通过这个开始图像:

winpty docker run --rm -it -p 8080:8080 my-web-app

命令提示符显示服务器已成功启动,当我尝试访问 Web 应用程序时,这也有效:

http://192.168.99.100:8080/my-web-app

显示适当的 HTML 欢迎页面。

当我尝试访问任何实际的 Jersey RESTful Web 服务时,就会出现问题。每当我尝试访问不同于 HTML 页面的内容时,都会收到以下错误消息:

javax.servlet.ServletException: Servlet.init() for servlet My Web Application threw exception
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1132)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
    org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2527)
    org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2516)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.lang.Thread.run(Thread.java:748)
root cause

java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;
    org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:308)
    org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:337)
    org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:178)
    org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:370)
    javax.servlet.GenericServlet.init(GenericServlet.java:158)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1132)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
    org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2527)
    org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2516)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.lang.Thread.run(Thread.java:748)

我认为 WAR 文件的创建可能有问题,但如果是这样,如何才能在我的本地 Tomcat 服务器上成功部署应用程序。

如果这有任何兴趣,这里是pom.xml我用来构建 WAR文件:

<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>my.webapp.host</groupId>
    <artifactId>my-web-app</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>my-web-app</name>

    <build>
        <finalName>my-web-app</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <inherited>true</inherited>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <dependencyManagement>
    </dependencyManagement>

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

        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-moxy</artifactId>
            <version>2.26-b03</version>
        </dependency>

        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-multipart</artifactId>
            <version>2.26-b03</version>
        </dependency>

        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>4.0.0-b05</version>
        </dependency>   

        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-json</artifactId>
            <version>1.19.3</version>
        </dependency>

        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-client</artifactId>
            <version>1.19.3</version>
        </dependency>

        <!-- persistence api -->
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.0-api</artifactId>
            <version>1.0.1.Final</version>
        </dependency>

        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>eclipselink</artifactId>
            <version>2.6.4</version>
        </dependency>

        <!-- additional apis -->        
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>

        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

         <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>19.0</version>
        </dependency>

        <!-- own apis -->  
        <dependency>
            <groupId>my.own.utility.api</groupId>
            <artifactId>utility-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
</project>

有谁知道这里的问题是什么?

任何帮助表示赞赏。

问候

卡尔帕·古纳拉特纳

这是针对所有遇到 NoSuchMethodError 的人的深入概述和解决方案,尤其是在球衣上下文中。

问题是

java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;

在 Java 中,当 JVM 找不到指定类中指定的方法时,会抛出 NoSuchMethodError。来自https://docs.oracle.com/javase/9​​/docs/api/java/lang/NoSuchMethodError.html

如果应用程序尝试调用类(静态或实例)的指定方法,并且该类不再具有该方法的定义,则抛出。

在您的情况下,JVM 抱怨javax.ws.rs.core.Application没有getProperties()方法。

Jesey 2.x 使用 JEE 7在 JEE 7 版本javax.ws.rs.core.Application

Jesey 1.x 使用 JEE 6在 JEE 6 版本中javax.ws.rs.core.Application只有

  • getClasses()
  • getclass()

但是getProperties()没有定义。https://jersey.github.io/apidocs/1.19.1/jersey/javax/ws/rs/core/Application.html

解决方案

您在 pom.xml 中定义了 jersey 2.x 和 1.x 版本。因此javax.ws.rs.core.Application,您的类路径中有 JEE6 和 7 版本,并且类加载器加载 JEE 6 版本的应用程序类,该类尚未getProperties()定义,但您的应用程序getProperties()无论如何都想执行因此错误。

从 pom.xml 中删除所有 jersey 1.x 版本并坚持使用 jersey 2.x 版本。类加载器将负责其余的工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何docker镜像spring boot应用程序?

InfluxDB docker镜像不适用于我的Spring Boot应用程序镜像

严重:Web应用程序[/ restapp]中的Servlet [Jersey Web应用程序]引发load()异常

使用 Jersey 的 Maven 中的 REST Web 应用程序

Docker 化 Web 应用程序

从头开始为应用程序创建 docker 镜像有意义吗?

Docker 最佳实践:使用操作系统还是应用程序作为基础镜像?

为什么导入后运行Docker镜像时无法启动应用程序

不使用Maven构建镜像即可对我的Spring Boot应用程序进行Docker化

如何从 docker 镜像中获取应用程序文件夹

分离 OS 环境 docker 镜像和应用镜像的最佳实践

将Apache Jersey for REST Web服务与struts2 Web应用程序集成

使用 Docker 构建我的 Web 应用程序时出错

已启动Web应用程序的Docker和http url

用于 Web 应用程序 devops 的示例 docker compose 设置

无法使用Docker在Tomcat上运行Web应用程序

文件不在docker workdir azure Web应用程序中

Docker:服务“ Web”构建失败(Django应用程序)

Azure Web应用程序容器和Docker命令

如何使用 Docker 运行 Flutter Web 应用程序?

Django Web 应用程序 Docker - 无法连接

如何从Docker容器内的应用程序发布Web服务?

docker 镜像中客户的不同应用设置

在 C 程序中构建 docker 镜像

Java Web 应用程序无法在使用 Jersey 2.26 的 Tomcat 8.5 或 9 上启动

不带web.xml的使用ResourceConfig的Jersey应用程序的URL

Jersey宁静的Web应用程序为所有资源URI返回404

使用嵌入式Jetty和jersey建立Web应用程序,并进行请求分派

使用jersey 2和cdi的简单Web应用程序示例?