You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署Java WAR包遇no main manifest attribute问题的排查与解决

Docker部署WAR包报错"no main manifest attribute, in name.war"的原因及解决办法

这个问题我之前帮同事排查过好几次,本质是没搞清楚WAR包和可执行JAR包的核心区别,咱们一步步来拆解原因和解决办法:

错误原因

  • WAR包本身不是可执行JAR:标准WAR包是为Tomcat、Jetty这类Servlet容器设计的部署格式,它的META-INF/MANIFEST.MF文件里并没有指定Main-Class(主类入口)属性。而你用java -jar命令运行时,JVM必须要这个属性才能知道启动哪个类,所以直接报错。
  • 另外你的Dockerfile还有个小疏漏:你用ADD指令复制的是name.war,但ENTRYPOINT里写的是atp.war,文件名不匹配,哪怕WAR包是可执行的,也会找不到文件,得先把这个小问题修正。

解决办法

方案1:用Tomcat镜像部署(最贴合WAR包设计的标准方案)

既然WAR包是给Servlet容器准备的,直接用官方Tomcat镜像部署最省心:

  1. 修改你的Dockerfile如下:
FROM tomcat:8-jdk8
EXPOSE 8080
# 把WAR包复制到Tomcat的webapps目录,容器启动时Tomcat会自动解压部署
ADD name.war /usr/local/tomcat/webapps/
  1. 重新构建镜像:
docker build -f Dockerfile -t name .
  1. 启动容器:
docker run -p 8080:8080 -d name

启动后,你的应用会默认部署在http://localhost:8080/name路径下,如果想直接用根路径访问,只需要把WAR包改名为ROOT.war就行。

方案2:将WAR包转为可执行包(适合独立运行场景)

如果一定要用java -jar直接运行,你需要把WAR包打包成包含嵌入式Servlet容器(比如嵌入式Tomcat)的可执行包:

  • 如果你用Maven,可以在项目的pom.xml中添加嵌入式Tomcat依赖,同时配置Maven打包插件,让它生成带有Main-Class属性的可执行WAR包。
  • 先在本地验证java -jar your-executable.war能正常启动,再修改Dockerfile:
FROM java:8
EXPOSE 8080
ADD your-executable.war your-executable.war
ENTRYPOINT ["java","-jar","your-executable.war"]

内容的提问来源于stack exchange,提问作者user9272082

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:27:13