Jersey Web应用程序的Docker镜像

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

我在我的开发机器上的本地Tomcat 8.0.14应用程序服务器上部署了Web应用程序,一切正常。

为了创buildDocker镜像,我把下面的Dockerfile. 在与my-web-app.war文件相同的目录中。

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

之后,我使用以下命令创build映像:

 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) 

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

如果这有什么pom.xml就是我用来构buildWAR的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>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尤其是在jersey上下文。

问题是

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

在Java中,当JVM无法find指定类中指定的方法时,会引发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中定义的jersey2.x和1.x版本。 因此,在classpath中有两个JEE6和7版本的javax.ws.rs.core.Application ,并且classloader加载了没有定义getProperties()但应用程序想要执行getProperties() JEE 6版本的appliction类。 因此,错误。

从你的pom.xml中删除所有的泽西1.x版本,并坚持泽西2.x版本。 类加载器将负责其余部分。