如何在Tomcat容器中运行.jar文件?Docker部署404问题求助
解决Tomcat容器中部署maven-wrapper.jar出现404的问题
兄弟,你这里的核心问题找错了——maven-wrapper.jar根本不是你的Spring Boot应用程序包,它只是一个用来帮你在未安装Maven的环境下执行Maven命令的工具,把它放到Tomcat里当然跑不起来啦!我来帮你梳理清楚正确的做法:
场景一:直接运行Spring Boot内嵌Tomcat的Jar包
Spring Initializr生成的项目默认是内嵌Tomcat的Jar包,这种情况下完全不需要依赖外部Tomcat容器,直接运行Jar就行,步骤如下:
- 打包出真正的应用Jar:在项目根目录下执行
./mvnw package(Windows系统用mvnw.cmd package),打包完成后,target目录下会生成类似your-project-name-0.0.1-SNAPSHOT.jar的文件,这才是你的应用程序包。 - 编写正确的Dockerfile:
FROM openjdk:8-jdk-alpine LABEL maintainer="deepak@softwareyoga.com" # 复制你的应用Jar到容器内 COPY target/your-project-name-0.0.1-SNAPSHOT.jar /app.jar EXPOSE 8080 # 启动应用 CMD ["java", "-jar", "/app.jar"]
- 构建并运行容器:
- 构建镜像:
docker build -t spring-boot-app . - 运行容器:
docker run -it -p 8081:8080 spring-boot-app
之后访问http://localhost:8081就能看到你的Spring Boot应用了。
- 构建镜像:
场景二:部署到外部Tomcat容器(生成War包)
如果你一定要用外部Tomcat来部署,需要把Spring Boot项目改成War包格式,步骤如下:
- 修改pom.xml配置:
- 将
<packaging>jar</packaging>改为<packaging>war</packaging> - 添加Tomcat依赖排除(避免和外部Tomcat冲突),并引入Servlet API依赖:
- 将
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
- 修改启动类:让启动类继承
SpringBootServletInitializer并重写configure方法:
@SpringBootApplication public class YourApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(YourApplication.class); } public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
- 打包War包:执行
./mvnw package,target目录下会生成your-project-name-0.0.1-SNAPSHOT.war。 - 修改Dockerfile:
FROM tomcat:8.0-alpine LABEL maintainer="deepak@softwareyoga.com" # 复制War包到Tomcat的webapps目录,Tomcat会自动解压部署 ADD target/your-project-name-0.0.1-SNAPSHOT.war /usr/local/tomcat/webapps/your-app.war EXPOSE 8080 CMD ["catalina.sh", "run"]
- 构建运行容器:
- 构建镜像:
docker build -t tomcat-spring-app . - 运行容器:
docker run -it -p 8081:8080 tomcat-spring-app
之后访问http://localhost:8081/your-app就能看到你的应用了(路径对应War包的名称)。
- 构建镜像:
为什么原来的方法会返回404?
Tomcat识别Web应用需要特定的目录结构(比如WEB-INF文件夹、web.xml配置等),而maven-wrapper.jar只是Maven的工具包,完全不具备Web应用的结构,所以Tomcat不会把它当作Web应用来处理,访问自然会返回404。
内容的提问来源于stack exchange,提问作者Abrahem Gh
相关产品推荐
相关产品推荐

