在tomcat docker上部署java REST服务
我试图将一个简单的REST服务部署到一个运行在docker上的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>
现在,如果我在eclipse中的tomcat服务器上运行该项目,一切都会正常工作(使用运行配置Base directory: ${workspace_loc:/RestTest}
和Goals: tomcat7:run
),我可以使用URL http://localhost:8080/rest_test/rest/test/hello
访问该服务
现在的问题是,我希望我的服务在服务器上docker中的tomcat上运行,这似乎不起作用
到目前为止,我尝试的是将项目导出到一个文件中。war文件(使用maven(gloals:clean install compile)或eclipse导出函数),将它们放在构建docker文件的目录中,创建docker文件并运行它
我正在使用的Dockerfile
(以下this tutorial)如下所示:
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 run -p 80:8080 mywebapp
运行docker容器时,我得到以下输出(对我来说似乎是正确的):
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
到目前为止,docker容器的启动似乎是正确的,我可以通过在浏览器中输入localhost
来访问tomcat的“主页”(见下图)。也是我的。war文件似乎已正确添加和提取(tomcat docker容器的目录webapps
中有一个rest_test.war
文件和一个rest_test
目录)。此外,从eclipse中启动时,一切都正常工作
目前还不起作用的是访问我创建和部署的rest服务。我试图使用url localhost/rest_test/rest/test/hello
访问它,但我得到一个HTTP错误404-找不到
有点奇怪的是,我在调用urllocalhost/rest_test/rest/...
时没有收到HTTP错误404中的消息,但我在调用任何其他url时收到消息(如下图所示),这让我认为这并不是完全错误的,我正在尝试的是
提前谢谢
编辑:使用docker映像tomcat:9.0-alpine
更新为tomcat 9,但这似乎没有改变任何事情。报告的内容。war文件如下所示:
# 1 楼答案
war文件似乎没有正确构建。缺少包含jar应用程序依赖项的
WEB-INF/libs
目录。有关Web应用程序存档文件here的目录布局的详细信息启动期间引发的异常将记录到
/usr/local/tomcat/logs/localhost.<timestamp>.log
。这就是一切似乎都正常工作的原因localhost.log
应包含以下错误:正如评论中提到的,jersey 2.26不能与java 1.7.0_181一起运行。由于在应用程序启动期间没有加载库,因此输出中没有java版本不兼容错误
现在,假设您使用Tomcat9和Java8运行,第一步是修复构建。我建议从命令行运行maven。你的
pom.xml
看起来很好,它应该会引发一场有效的战争下一步是将
javax.ws.rs-api
库的范围设置为提供。jersey-bundle
库的javax.ws.rs
类版本稍有不同,如果保留这两个类,则可能会遇到类加载问题这将解决问题,但配置仍然存在问题,因为您正在使用jersey 1。x和球衣2。x库。此外jersey-bundle不应与maven一起使用该捆绑包仅适用于不使用Maven依赖系统的开发人员
使用jersey 2库的基本依赖项配置应如下所示:
也应修改
web.xml
:希望能有帮助