NAS部署Tomcat实战:轻松运行Java Web项目(WAR/HTML/JAR全解析)
Apache Tomcat 是一款开源、免费的轻量级 Java Web 应用服务器,主要用于运行 Servlet 和 JSP 程序,常被用来部署 Java 网站和接口服务。简单来说,别人用 Java 开发并打包好的程序,放到 Tomcat 里就能直接在服务器上跑起来。

利用 Docker Compose 快速安装 Tomcat
以下是推荐的 Compose 配置:
services:
tomcat:
image: tomcat:9.0
container_name: tomcat
volumes:
- ./webapps:/usr/local/tomcat/webapps
ports:
- 8080:8080
restart: unless-stopped
几个关键参数说明(更多细节建议查阅官方文档):
- 镜像标签
9.0:适配 Java 8,大多数企业项目和旧系统都采用这一版本。 - 容器内路径
/usr/local/tomcat/webapps:默认的应用部署目录,所有要运行的项目文件最终都要放到这里。
初次访问与 404 现象
服务启动后,在浏览器输入 http://NAS的IP:8080 就能打开 Tomcat 页面。

如果看到 404 错误,这是正常情况。因为此时
webapps路径下还没有ROOT目录,Tomcat 找不到默认页面,所以返回 404。

如何恢复官方演示 Demo
Tomcat 镜像里其实内置了一个演示应用,如果想让首页出现熟悉的欢迎画面,可以按下面的步骤操作。

首先进入 Tomcat 容器的终端。

默认工作目录就是 /usr/local/tomcat,如果不是,请手动切换到该路径:
cd /usr/local/tomcat

查看当前路径下的文件,你会发现 webapps 目录(已经映射到宿主机做数据持久化),以及 webapps.dist 目录,后者就包含了原始的欢迎页面和示例程序。
ls

将 webapps.dist 中的所有内容移动到 webapps 目录:
mv webapps.dist/* webapps

现在进入 webapps 文件夹,可以看到文件已经被复制过来。

刷新浏览器,经典的 Apache Tomcat 示例页面就出现了。

部署静态 HTML 项目
如果只是想放一个简单的网页,操作非常简单:先清空 webapps 下的所有文件,然后新建一个 ROOT 文件夹。

把你要展示的 HTML 文件直接放入 ROOT 目录即可。

这里用 AI 快速生成一个 Hello World 页面作为例子。

部署 WAR 包:自动解压一键上线
WAR 包是 Tomcat 最原生的部署格式,交付特别省心。同样,第一步清空 webapps 目录。

演示用到的示例 WAR 文件:
https://tomcat.apache.org/tomcat-9.0-doc/appdev/sample/sample.war
将下载的 WAR 包重命名为 ROOT.war。这样 Tomcat 自动解压后生成的文件夹也叫 ROOT,浏览器就能直接通过根路径访问,否则会出现路径错乱,无法正常运行。

把重命名后的 ROOT.war 放到 webapps 目录,Tomcat 会立即检测到并自动解压。

稍等片刻后刷新页面,应用就已经正常运行了。

JAR 包部署的注意事项与端口冲突解决
严格来说,JAR 包更适合直接用 Java 命令启动,而不是硬塞给 Tomcat。但如果业务场景确实需要在 Tomcat 内部运行 JAR,可以按照下面的流程操作,不过整体维护会比 WAR 方式复杂一些。

两个示例 JAR 包可以参考:
- Spring Boot 项目,提供
/hi接口:https://github.com/findyou230/hello-java-jar - 控制台打印 Hello World,无 Web 界面:
https://github.com/jarirajari/helloworld
先将 JAR 包放到 webapps 目录(注意,它不会自动解压)。

进入容器的终端,切换到 webapps 路径并查看文件:
cd /usr/local/tomcat/webapps
ls

尝试运行 JAR 包:
java -jar hello-0.0.1-SNAPSHOT.jar
大概率会报端口占用的错误,因为 Tomcat 本身已经占用了 8080 端口,而我们要启动的项目也默认监听 8080。

解决办法有两个:
- 如果你是开发者,可以修改 JAR 项目的端口再重新打包;
- 或者直接修改 Tomcat 镜像的内部端口。
下面演示修改 Tomcat 内部端口的方式。首先进入容器终端,复制配置文件:

cp /usr/local/tomcat/conf/server.xml /usr/local/tomcat/webapps

打开并编辑 server.xml:

找到 <Connector port="8080" ... 这一行,把 8080 改为 8090(或者其他未占用的端口)。

然后调整 Docker Compose 配置,增加 8090 的端口映射,并挂载修改后的 server.xml(如果不想直接放在 webapps 目录,可以单独映射):
services:
tomcat:
image: tomcat:9.0
container_name: tomcat
volumes:
- ./webapps:/usr/local/tomcat/webapps
- ./webapps/server.xml:/usr/local/tomcat/conf/server.xml
ports:
- 8080:8080
- 8090:8090
restart: unless-stopped
重新部署后,访问 8090 就能看到 Tomcat 的页面,说明 8080 端口已经腾出来了。

再次运行 JAR 包,这次就不会再报端口冲突。

访问 8080 端口,如果能看到应用返回的内容,就说明 JAR 已正常运行。如果希望容器启动时自动运行 JAR,只需在 Compose 中添加 command 字段即可,无需每次手动启动。

扩展知识:WAR 与 JAR 的本质差异

WAR 包:需要依赖外部 Web 容器(如 Tomcat)运行。部署时先启动服务器,再将应用放入指定目录。这种方式虽然多了一个中间层,但能够充分利用独立服务器的连接池、集群等高级特性,对大规模应用更为友好。
JAR 包:内置了嵌入式 Servlet 容器,可以脱离外部服务器独立运行,只需一条 java -jar 命令。这种形式配置简单、启动快,非常适合微服务和敏捷开发场景,不过在深度运维管理上可能不如外部服务器灵活。
现代 Spring Boot 项目绝大多数都推荐使用 JAR 打包形式,因为它更符合“约定大于配置”的思想,运维也更为省心。
相关打包教程可以参考:
- SpringBoot 项目 JAR 打包:
https://blog.csdn.net/m0_67392126/article/details/126115957 - SpringBoot 项目 WAR 打包:
https://www.jb51.net/article/202524.htm
总结
Tomcat 是一款经典的轻量级 Java Web 服务器,适合部署各种 Java 应用。对普通 NAS 用户来说,日常确实用到的场景不多,但如果你需要跑一些游戏服务端或者开源的 Java 项目,它就是一个很好的容器。
三种部署方式中,WAR 包和静态 HTML 最为简单省心;而 JAR 包个人更建议直接用 Java 环境启动,不要勉强塞进 Tomcat。
- 综合推荐:⭐⭐⭐(普通用户不一定需要)
- 使用体验:⭐⭐⭐(常规开发工具,WAR/HTML 部署便捷)
- 部署难度:⭐⭐(上手容易)