摘要生成中...
AI 摘要
Hunyuan-lite

Java 项目的打包产物有两种形式:

  • war 包:依赖 Web 服务器。部署 war 包的常见服务器有 Tomcat 和 Jetty。
  • 内嵌 Web 服务器的可直接运行的 jar 包。比如 SpringBoot 框架开发的项目打包产物。

本地运行 SpringBoot 程序

由 SpringBoot 框架开发的项目打包之后得到的是 jar 包,里面内置了 Tomcat 等 Web 服务器。我们通常只需要一行命令启动 jar 包即可:

1
java -jar app.jar --spring.profiles.active=prod # 指定环境为 prod

如果想在后台运行 jar 包,那就给命令开头补充 nohup ,结尾补充 &

关于多环境的更多内容详看:站内文章多环境部署项目

Linux+Nginx 原始方式

Nginx 的安装与反向代理配置详看:站内文章Nginx 的安装与反向代理配置

首先检查服务器 Java 有没有正确安装:

1
2
3
4
5
java --version

# openjdk version "1.8.0_402"
# OpenJDK Runtime Environment (build 1.8.0_402-b06)
# OpenJDK 64-Bit Server VM (build 25.402-b06, mixed mode)

我们可以在服务器上安装好 Maven,然后拉取代码,在服务器上进行打包构建:

1
2
git clone https://xxxxx/xxxx.git # 拉取代码
mvn package # 打包命令,加上 -DskipTests 可以跳过测试

也可以在本地用 Maven 打好 jar 包,再上传到服务器中,这样服务器就不用安装 Maven 了。比如假设我扔在这个目录中:/var/www/temp_test。必要时给予权限:

1
chmod a+x my-backend-0.0.1-SNAPSHOT.jar

在服务器中运行这行命令即可后台启动项目,跟本地运行 SpringBoot 项目的方法一致:

1
2
# 注意 jar 包的权限是否可执行
nohup java -jar ./app.jar --spring.profiles.active=prod & # 注意Linux路径写法不要错

关于 nohup 命令的更多信息,详看文章:站内文章Linux 使用 nohup 后台运行程序

我们可以通过一些命令查看 Java 程序是否启动:

1
2
3
jobs # 查看运行程序
netstat -ntlp # 查看占用端口情况
jps # 查看所有已经运行的Java程序

Nginx 配置文件示例:

1
2
3
4
5
6
7
8
9
10
11
12
server{
server_name projects.uuanqin.top; ;
# 前端
location / {
root /var/www/temp_test/myapp;
index index.html index.htm;
}
# 后端 顺便解决跨域
location /api {
proxy_pass http://localhost:8123;
}
}

Docker 容器技术

Docker 是一种容器技术,可以将项目的环境(比如 Java、Nginx)和项目的代码一起打包成镜像,所有具有权限的用户都能下载镜像,更容易分发和移植。使用 Docker 容器技术,理论上可以封装任何环境和应用,对于后端 Java 项目来说,把 Java 环境、Maven 和 jar 包封装成一个镜像就好了。

启动项目时不需要敲更多的命令,而是通过下载镜像、启动镜像即可。

安装 Docker

自行下载安装 Docker,检查 Docker 安装是否成功:

1
docker --version

编写 Dockerfile

Dockerfile 记录了项目的打包构建流程,我们可以通过编写这个文件指定构建 Docker 镜像的方法。一般情况下,Dockerfile 不需要自己写,可以直接在网上找。

Dockerfile 一般放置在项目的根目录中:

  • FROM:依赖的基础镜像
  • WORKDIR:工作目录
  • COPY:从本机复制文件
  • RUN:执行命令
  • CMD / ENTRYPOINT:指定运行容器时默认执行的命令,ENTRYPOINT 可以附加额外参数

方式 1:在服务器中进行 Maven 打包

下面是一份使用了 Maven 打包工具在服务器中进行打包的 Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Docker 镜像构建
# 依赖于基础镜像
FROM maven:3.5-jdk-8-alpine as builder

# Copy local code to the container image.
# 指定工作目录
WORKDIR /app
# 本地把代码复制到容器中("."指的是当前目录"/app")
COPY pom.xml .
COPY src ./src

# 配置Maven源提升下载速度
COPY settings.xml /usr/share/maven/conf/settings.xml

# Build a release artifact.
# 执行Maven的打包命令
RUN mvn package -DskipTests

# Run the web service on container startup.
# 一些参数可以在启动Docker时覆盖掉,这里可以把环境参数写死
CMD ["java","-jar","/app/target/my-backend-0.0.1-SNAPSHOT.jar","--spring.profiles.active=prod"]

因为上面的 Dockerfile 中我们交给容器执行 maven 的打包命令,但是容器中 maven 仓库源为默认地址,下载速度极慢。我们需要配置 Maven 的下载源更换为阿里的镜像仓库。在项目主目录加上 settings.xml 文件,文件内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository/>
<interactiveMode/>
<usePluginRegistry/>
<offline/>
<pluginGroups/>
<servers/>
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
<mirror>
<id>repo1</id>
<mirrorOf>central</mirrorOf>
<name>central repo</name>
<url>http://repo1.maven.org/maven2/</url>
</mirror>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>apache snapshots</mirrorOf>
<name>阿里云阿帕奇仓库</name>
<url>https://maven.aliyun.com/repository/apache-snapshots</url>
</mirror>
</mirrors>
<proxies/>
<activeProfiles/>
<profiles>
<profile>
<repositories>
<repository>
<id>aliyunmaven</id>
<name>aliyunmaven</name>
<url>https://maven.aliyun.com/repository/public</url>
<layout>default</layout>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>MavenCentral</id>
<url>http://repo1.maven.org/maven2/</url>
</repository>
<repository>
<id>aliyunmavenApache</id>
<url>https://maven.aliyun.com/repository/apache-snapshots</url>
</repository>
</repositories>
</profile>
</profiles>
</settings>

更多 Docker 镜像源切换参考:Docker镜像加速指南:手把手教你配置国内镜像源-阿里云开发者社区

方式 2:直接运行本地打包好的 jar 包

为了节省时间,提高构建速度,下面的这个 Dockerfile 忽略了 Maven 打包的过程,直接运行 jar 包:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 使用官方的 Java 21 基础镜像
FROM openjdk:21

# 设置工作目录
WORKDIR /app

# 将本地的 JAR 文件复制到容器中
COPY image-search-mcp-server-0.0.1-SNAPSHOT.jar /app

# 暴露应用程序的端口
EXPOSE 8991

# 定义启动命令
CMD ["java", "-jar", "image-search-mcp-server-0.0.1-SNAPSHOT.jar","--spring.profiles.active=prod"]

我们在服务器合适的位置,上传这个 Dockerfile 和我们在本地已经打包好的 jar 包:

image.png

镜像的构建与运行

当你通过以上两种方式编写好 Dockerfile 后,可在存在 Dockerfile 的目录下,执行镜像构建:

1
2
# -t 打标签,"."表示使用当前的目录的Dockerfile构建镜像
docker build -t image-search:v1 .

运行镜像,指定端口以及重启策略:

1
2
# -d 表示后台运行
docker run -d --restart unless-stopped -p 8991:8991 --name image-search-server image-search:v1

部署在阿里云服务器的,记得在云安全组中开发所需的端口。

接下来弄好 站内文章Nginx 反向代理配置,就可以进行测试了。

宝塔 Linux 部署

宝塔是一款 Linux 运维面板软件。可以更方便管理服务器软件或部署项目。

官网下载:宝塔面板下载,免费全能的服务器运维软件 (bt.cn)

建议在纯新系统安装宝塔面板,不支持已经部署项目/环境的系统进行安装。

容器托管平台的部署

容器平台:

  • 云服务商的容器平台(腾讯云、阿里云)
  • 面向某个领域的容器平台(前端 / 后端微信云托管)

使用容器平台的优点:

  • 不需要购买云服务器
  • 不用输命令来操作,更方便省事
  • 不用在控制台操作,更傻瓜式、更简单
  • 大厂运维,比自己运维更省心
  • 额外的能力,比如监控、告警、其他(存储、负载均衡、自动扩缩容、流水线)

微信云托管:微信云托管 (qq.com)

本文参考

更多参考——其他应用的部署方式: