Render上后端部署Springboot + 前端Vue 问题及解决方案汇总
有一个 Vue 前端 和 Spring Boot 后端的动态网页游戏,当前在本地的 5173 端口和运行。你希望生成一个公开链接,让所有点击链接的人都能访问并玩这个游戏。由于游戏原本需要在本地执行 npm install
后才能启动,你现在想知道在部署时是选择 Render 还是 Heroku,并且哪一个能支持你的 Spring Boot 后端。最后,你需要知道选择其中一种平台后,每一步具体的部署流程是什么。
部分 | 需要创建 | Render 类型 | Root Directory | Build Command | Start Command / Publish Directory |
---|---|---|---|---|---|
后端 (Spring Boot) | 1 次 | Web Service | backend/ (如果有的话) | mvn clean install | java -jar target/your-app.jar |
前端 (Vue 3) | 1 次 | Static Site | frontend/ (如果有的话) | npm install && npm run build | dist |
注意:
1 Render上不支持直接部署Jar,必须把springboot项目先用dockerfile制作成容器,只能部署docker容器
2 Docker不支持直接构建springboot,必须先使用maven image构建和运行
3 Windows家庭版不能使用Docker,必须先开启wsl2
4 不要信ChatGPT给你提供的image版本,一定要自己去docker hub上的tags里找!
如何在 Render 上部署 Spring Boot 后端?
你想让 Render 直接从 GitHub 项目部署,所以按照下面步骤来做:
第一步:确保你的 GitHub 代码正确
-
在
application.properties
里加上server.port=${PORT:8080} 这样 Render 就能正确读取PORT
环境变量,不用再手动指定端口。server.port=${PORT:8080}
-
检查
pom.xml
,确保有spring-boot-maven-plugin
这个插件会帮你打包.jar
,Render 需要它。<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins> </build>
-
把这些改动 push 到 GitHub
第二步:在 Render 上创建 Web Service
- 点击“New Web Service” 连接 GitHub 并选择你的后端项目仓库。
- 填写部署配置:
- Build Command(构建命令):
mvn clean install
- Start Command(启动命令):
java -jar target/your-app.jar
- Build Command(构建命令):
总结:
-
在 Render 上创建 Web Service
-
连接 GitHub 代码
-
设置
Build Command: mvn clean install
-
设置
Start Command: java -jar target/your-app.jar
-
等待 Render 自动构建,获取后端 URL
-
修改 Vue 前端,让前端请求 Render 后端的 API
-
部署 Vue 前端(可以用 Render 的 Static Site 或 Netlify)
初始部署失败:一开始没有docker,试图直接运行jar
- 错误信息:
bash: line 1: mvn: command not found ==> Build failed 😞
- 原因:你在 Render 的 Web Service 直接配置了
mvn clean install
作为构建命令,但 Render 默认不安装 Maven,也不能直接运行jar( Web service里的选项里没有)
还有个初始的初始错误,一开始都没有打包,试图直接运行源码。
问题 1: mvn clean install
和 java -jar target/your-app.jar
需要在本地运行吗?可以在本地运行 mvn clean install
,看看是否成功生成 .jar
文件(在 target/
目录下)。不是必须的,但可以用来提前检查是否有问题。
问题 2:我已经构建过了,但为什么你说需要 mvn clean install
?
Maven 运行 ≠ 生成 JAR,你需要 mvn clean install
来打包 JAR,放进docker file里。你的理解: 你直接用 Maven 运行了项目,并且本地能成功运行,所以你认为已经完成了构建。我解释:本地直接运行 Spring Boot 项目(mvn spring-boot:run
)时,Maven 会自动编译代码并运行,但不会生成一个可执行的 JAR 文件。在 Render 或其他部署平台上,你需要一个 Docker容器而不是一个jar包,而doc文件又必须是“构建可执行的 JAR 文件再运行”,而不是仅仅运行源码。所以,你需要 mvn clean install
来打包应用,
使用 Docker 部署
1. 创建 Dockerfile
:在 backend/
目录下创建 Dockerfile
:确保 mvnw
文件存在于项目根目录
Dockerfile位置:后端项目根目录,和mvnw
,pom同级
F:\git_local\Tic-Tac-Toe\backend 的目录2025/02/06 13:27 <DIR> .mvn
2025/02/08 16:23 502 Dockerfile
2025/02/06 14:01 300 HELP.md
2025/02/06 13:27 10,665 mvnw
2025/02/06 13:27 6,912 mvnw.cmd
2025/02/07 13:23 2,134 pom.xml
2025/02/06 13:27 <DIR> src
2025/02/08 15:48 <DIR> target
2. Render 上选择 Docker 作为语言:创建新 Web Service → 选择 Docker 语言 → 填写 Git 仓库信息 → 完成部署设置。
为什么不能直接在 Dockerfile 中直接使用 Spring Boot 的基础镜像?
Dockerfile 中无法直接使用类似 FROM springboot-oraclejre-nanoserver:latest
的镜像,原因如下:
-
Spring Boot 没有官方基础镜像
Spring Boot 本身是一个基于 Java 的框架,其运行依赖 JDK/JRE 环境,而不是独立的操作系统或运行时。因此,构建 Spring Boot 应用的 Docker 镜像时,应选择 JDK 或 JRE 基础镜像(如openjdk
、eclipse-temurin
),而非虚构的 "Spring Boot 镜像"310。 -
构建与运行分离的多阶段构建需求
Spring Boot 应用需要通过 Maven 或 Gradle 编译打包生成可执行的 JAR 文件,再将 JAR 文件复制到轻量级运行环境中。典型的 Dockerfile 分为两个阶段:-
构建阶段:使用 Maven 镜像(如
maven:3.8.7-openjdk-17
)执行mvn clean package
生成 JAR 文件。 -
运行阶段:使用 JDK/JRE 镜像(如
eclipse-temurin:17-jre-slim
)运行 JAR 文件4810。
-
怎么写Dockerfile 来正确运行你的构建产物 target/demo-0.0.1-SNAPSHOT.jar
:
错误的Dockerfile:
# Build stage:
FROM maven:3.8.7-openjdk-17 AS build 实际上根本没有这个镜像,这是gpt自己胡编的!!!!
WORKDIR /app
COPY . .
RUN mvn clean package -DskipTests# Production stage:
FROM openjdk:17-slim 实际上根本没有这个镜像,这是gpt自己胡编的!!!!
ARG PORT=8080
COPY --from=build /app/target/*.jar /app.jar
EXPOSE ${PORT}
CMD ["sh", "-c", "java -jar /app.jar --server.port=${PORT}"]
(1) **Dockerfile 问题分析**
# 错误点 1:COPY 路径错误
COPY ../target/*.jar app.jar # 无法访问父目录
# 正确应为:COPY --from=build /app/target/*.jar app.jar# 错误点 2:ENTRYPOINT 与 CMD 冲突
ENTRYPOINT ["java","-jar","/app.jar"] # 覆盖后续 CMD 参数
CMD ["sh", "-c", "java -jar /app/app.jar --server.port=$PORT"] # 冗余且冲突# 错误点 3:EXPOSE 端口与 ENV 变量未关联
EXPOSE 8080 # 硬编码端口,未使用 ENV PORT
正确的Dockerfile内容:
# Build stage: 使用 Maven 3.8.7 和 OpenJDK 17 编译项目
FROM maven:3.9.9-eclipse-temurin-17-focal AS build
WORKDIR /app
COPY . .
RUN mvn clean package -DskipTests# Production stage: 使用轻量级 OpenJDK 17 运行 jar 包
FROM openjdk:17-jdk-alpine3.12
ARG PORT=8080
ENV PORT=${PORT}
# 从 build 阶段复制 jar 文件到 /app/app.jar
COPY --from=build /app/target/demo-0.0.1-SNAPSHOT.jar /app/app.jar
EXPOSE 8080
CMD ["sh", "-c", "java -jar /app/app.jar --server.port=${PORT}"]
关键改动解释:
1. 关于 Dockerfile 中端口设置的原理
-
EXPOSE 指令的作用
EXPOSE
指令仅仅是用来文档化说明容器内部程序将监听哪个端口,并不会真正创建主机与容器之间的端口映射。也就是说,它只是告诉使用者:“这个容器里运行的服务打算在这个端口上提供服务。”
-
动态端口映射的含义
- 动态端口映射指的是在容器运行时,通过
docker run -p
(或者使用像 Render 这样的部署平台提供的配置)将容器内部的端口映射到主机上的任意指定端口。例如,运行时你可以决定将容器内的 8080 端口映射到主机的 80 端口,这种映射关系是在运行容器时动态配置的。
- 动态端口映射指的是在容器运行时,通过
-
为什么不建议在 EXPOSE 中使用变量?
- 虽然 Dockerfile 中可以使用
ARG
或ENV
传递变量,但EXPOSE
通常要求写定一个静态的端口号,因为它的作用主要是用于说明和自动文档生成,而不是实现真正的端口绑定。同时,在运行时,端口映射完全依赖于你在docker run
命令中指定的-p
参数。
- 虽然 Dockerfile 中可以使用
2. 分析你的 Dockerfile 各行代码
-
构建阶段:
WORKDIR /app
:设置工作目录为/app
。COPY . .
:将项目所有文件复制到镜像内的/app
目录。RUN mvn clean package -DskipTests
:执行 Maven 构建命令,生成最终的 JAR 包(存放于/app/target/
目录下)。
-
生产阶段:
ARG PORT=8080
:定义了一个构建参数PORT
,默认值为 8080。注意,这个变量只在构建阶段有效,并不会自动传递到容器的运行环境中。COPY --from=build /app/target/*.jar /app.jar
:从构建阶段复制生成的 JAR 包到当前镜像中,并命名为/app.jar
。这里使用通配符可能会复制不止一个文件(例如有.jar
和.jar.original
),建议直接指定文件名EXPOSE ${PORT}
:此行用于声明容器将监听的端口。问题在于:如果没有通过ENV
将PORT
设置到运行环境中,可能不会按预期替换变量。另外,EXPOSE
指令只用于文档化目的,不会进行实际的端口映射。CMD ["sh", "-c", "java -jar /app.jar --server.port=${PORT}"]
:这一行用来启动应用,并将--server.port=${PORT}
传递给应用。如果PORT
没有被正确导入到环境变量中,shell 命令中的${PORT}
可能无法按预期替换。
- 原 Dockerfile 中
COPY ../target/*.jar
在多阶段构建中无效,需通过--from=build
直接从构建阶段复制文件 - 明确指定 JAR 文件:避免
.original
文件匹配问题。 - ENV 解决
PORT
变量解析问题:ENV SERVER_PORT=${PORT}
让CMD
解析变量。 - EXPOSE 8080:不能用
${PORT}
,只能静态声明,动态端口映射要用docker run -p
。 WORKDIR /app
让文件结构更清晰:所有文件都在/app
下。-
ENTRYPOINT
和CMD
同时使用时,CMD
的参数会附加到ENTRYPOINT
后。若需动态参数(如--server.port=$PORT
),应统一为ENTRYPOINT
的 Shell 形式
3. 验证与运行命令建议
(1) **构建命令**
```bash
docker build -t springboot-app:latest .
```
(2) **运行命令**
```bash
# 指定自定义端口(如 9090)
docker run -p 9090:9090 -e PORT=9090 springboot-app:latest
```
(3) **验证步骤**
1. 检查镜像是否生成:`docker images | grep springboot-app`
2. 查看容器日志:`docker logs <container-id>`
3. 验证端口监听:`curl http://localhost:9090`
关于 Dockerfile 中端口设置的原理
下面我将尽可能详细地解释在不同场景下端口的含义与变化,分别说明:
a) 生产环境(本地直接运行 Spring Boot)
b) 容器化环境(在 Docker 内运行 Spring Boot)
c) 部署到 Render 上时的环境
1. 本地生产环境(直接运行 Spring Boot)
在本地运行 Spring Boot 时,应用通常默认监听 8080 端口;这时只有一个服务器,就是你所在的本机操作系统运行的 Java 进程。端口 8080是由 Spring Boot 应用本身绑定的,你直接通过浏览器访问 http://localhost:8080 就能访问应用。在这种环境下,并不存在额外的网络隔离或端口转换;只有单一网络环境(你的本机 OS)。
2. 容器化环境(在 Docker 内运行 Spring Boot)
-
中文:当你使用 Dockerfile 构建镜像并以容器方式运行 Spring Boot 时,应用仍然会在容器内监听 8080(或你配置的其他端口);也就是说,容器内部的网络环境中,Spring Boot 使用的是 8080 端口。
English: When you build a Docker image using your Dockerfile and run Spring Boot in a container, the application still listens on port 8080 (or whichever port you have configured) inside the container’s network. -
中文:这里涉及两个“网络环境”或“服务器”:
- 容器内部:Spring Boot 应用运行在容器内,监听 8080。
- 宿主机:这是运行 Docker 的机器;如果你希望从本机访问容器内的服务,需要通过端口映射将宿主机的某个端口转发到容器的 8080。
3. 部署到 Render 上时的环境
当你把容器部署到 Render 平台时,Render 提供的运行环境与本地或普通 Docker 环境略有不同。Render 要求你的容器在启动时监听一个由平台指定的端口,这个端口通常会通过环境变量(一般为 PORT
)传递给容器.在 Render 的环境中,容器内的 Spring Boot 应用应当使用这个环境变量来确定它要监听的端口。例如,在启动命令中写成 java -jar /app.jar --server.port=$PORT
,这样无论 Render 分配哪个端口,应用都能正确监听。
-
在 Render 部署后,仍然存在两个层面的“端口”:
- 容器内部:应用按照 Render 提供的
PORT
环境变量进行监听(这可能依然是 8080,也可能是 Render 动态分配的其他值)。 - Render 平台的外部入口:Render 平台会将外部请求通过负载均衡或反向代理转发到容器内对应的端口;这个外部端口对用户来说可能是透明的,即你只需要提供 Render 分配的 URL。
- 容器内部:应用按照 Render 提供的
-
简而言之,在 Render 上部署时:
- 你无需手动做 Docker 的端口映射,因为 Render 的平台会自动把外部流量转发到你容器内监听的那个端口(即
$PORT
指定的端口)。Render 的文档建议你的容器务必使用环境变量指定的端口来启动服务,否则外部请求无法正确路由到你的应用。
- 你无需手动做 Docker 的端口映射,因为 Render 的平台会自动把外部流量转发到你容器内监听的那个端口(即
回答你的具体问题
问题 1:在本地运行、容器化后的情况
- 本地运行:Spring Boot 默认监听 8080,只有一个服务器(你的本机 OS),端口 8080 由 Spring Boot 占用。
- 容器化后:
- 容器内部:Spring Boot 应用依然在容器内部监听 8080(或配置的端口);这属于容器的私有网络。
- 宿主机(Docker 主机):如果你使用
docker run -p 8080:8080
映射端口,则宿主机的 8080 端口会把外部请求转发到容器的 8080。 - 设置时,在 Dockerfile 中用
EXPOSE 8080
仅做声明,而实际映射在运行容器时通过-p
参数指定。 - 端口 8080 在容器内部是由 Spring Boot 占用;在宿主机上则由 Docker 端口映射起到转发作用。
- 因此,在容器化环境下,从外部看,你有两个网络层次:宿主机端口(映射层)和容器内的服务端口。
问题 2:部署到 Render 后
- 部署到 Render 上时,Render 平台会为你的服务提供一个外部入口和 URL,同时通过环境变量(通常为
PORT
)告知你的容器应监听哪个端口。- 容器内部:你的 Spring Boot 应用需要根据环境变量启动,例如使用命令
java -jar /app.jar --server.port=$PORT
,这样无论 Render 分配哪个端口,应用都能正确监听。 - Render 平台:在 Render 的基础设施中,外部用户访问的是 Render 提供的 URL,Render 的负载均衡器或反向代理会把请求转发到容器内部监听的那个端口。
- 整个过程中,你实际上只需要确保容器内部监听的是 Render 指定的端口;外部的端口映射由 Render 自动管理。
- 所以,部署到 Render 后:
- 内部服务端口:由环境变量
$PORT
决定,可能默认是 8080,但 Render 可能分配其他值。 - 外部入口:由 Render 提供和管理,用户只需通过 Render 提供的 URL 访问,不必关心具体端口。
- 内部服务端口:由环境变量
- 容器内部:你的 Spring Boot 应用需要根据环境变量启动,例如使用命令
# 定义运行时端口,并将构建参数转换为环境变量
ARG PORT=8080
ENV PORT=${PORT}# 明确指定 JAR 文件,避免通配符匹配不确定性
COPY --from=build /app/target/demo-0.0.1-SNAPSHOT.jar /app/app.jar# 声明服务监听的端口(这里建议直接写数值)
EXPOSE 8080# 运行 Spring Boot 应用,利用环境变量替换端口
CMD ["sh", "-c", "java -jar /app/app.jar --server.port=$PORT"]
- 通过
ENV PORT=${PORT}
将构建参数转换为运行时的环境变量,确保 CMD 中$PORT
能正确替换。在EXPOSE
中直接写明8080
,因为该指令只用于文档化,实际端口映射在运行容器时由 Render 或docker run -p
指定。 -
变量传递问题:你在生产阶段使用了
ARG PORT=8080
,但这个变量仅在构建时存在。如果你希望在 CMD 中使用这个端口变量,必须通过ENV
显式地将其传递到容器运行时环境中。 -
EXPOSE 指令的静态要求:由于
EXPOSE
只是用于说明目的,不会动态绑定端口,所以最好写成静态的数值(例如EXPOSE 8080
),并在运行时利用docker run -p
来进行真正的端口映射。 -
部署在 Render 上的注意点:在 Render 这类平台上部署时,通常需要你指定服务监听的固定端口,且端口映射和路由都是由平台配置的。因此,确保你的 Dockerfile 中声明的端口与 Render 平台要求一致就很重要。
你不理解 docker run -p 8080:8080
的作用,尤其是冒号前后 8080 的区别。我们来详细分析:
端口(Port)是计算机网络中的逻辑地址,用来区分同一台机器上不同的服务。例如:
- 服务器(Server)运行 HTTP 服务(如 Spring Boot)时通常监听端口 8080。
- 客户端(Client)(如浏览器)通过某个端口(通常是随机分配的 30000-60000 之间的端口)连接到服务器的 8080 端口。
docker run -p 8080:8080 my-container
- 左边 8080(宿主机端口): 运行 Docker 容器的机器(比如你的本机或 Render 平台)上的端口。
- 右边 8080(容器内部端口): 容器内 Spring Boot 运行的端口。
这表示:当访问宿主机的 http://localhost:8080**,Docker 会将请求转发**到容器内部的 **http://容器内部IP:8080**。
转发(Port Forwarding)指的是宿主机将接收到的请求,自动传递到容器内部的对应端口。
- 服务器(Server): 监听某个端口(例如 8080),等待客户端请求。
- 客户端(Client): 通过某个端口(通常是随机的)向服务器发送请求。
但在 Docker 里,容器和宿主机相当于两个不同的网络环境:
- 容器内部是自己的小世界,不能直接访问宿主机的端口。
- 所以
-p
选项的作用就是把宿主机的端口和容器内部的端口连接起来。
问题 2:EXPOSE 8080 在 Render 上是否有用?
这个指令 不会 映射端口,它只是:标注容器内部的应用监听了 8080 端口 供 Docker 容器编排工具(如 Kubernetes 或 Render)参考
2.2 在 Render 上,${PORT} 由谁决定?
- Render 会分配一个端口(通常是 10000-60000 之间的随机端口),并将这个端口的值存入环境变量
$PORT。
你的 Spring Boot 应用必须监听$PORT
,否则 Render 无法访问你的服务。
2.3 为什么 EXPOSE 8080 可能没用?
在 Render 上:你并不手动运行 docker run -p
,Render 自动 处理端口转发。你的容器必须 监听 $PORT
,而不是固定的 8080
。
所以,Dockerfile 里你应该改成:CMD ["sh", "-c", "java -jar /app.jar --server.port=${PORT}"]
这样,Spring Boot 会监听 Render 分配的端口,而不是默认的 8080
。
问题 3:Render 上的端口分配
3.1 docker run -p 的作用
docker run -p
作用是手动 映射端口,但在 Render 上,这个过程是自动的,Render 直接处理端口映射,你不需要手动 -p
。
3.2 Render 上有没有“宿主机”?
在 Render 上:
- 你的应用运行在一个容器里,没有“宿主机”的概念,Render 直接管理网络。
- 你只需要监听
$PORT
,Render 会自动将外部流量转发进来。 - Render 分配一个服务器(运行你的容器)。
- Render 分配一个端口(通常在 10000-60000 之间)。
- Render 提供一个 URL(例如
https://your-app.onrender.com
)。 - 所有外部请求都会通过这个 URL 进入你的后端。
你不需要关心 Render 具体分配的端口,你的应用只要监听 $PORT
,Render 就会正确转发。
### Dockerfile踩坑全纪录
1 构建失败:Java 版本不匹配
问题原因: Render 的默认 Java 版本与 Maven 项目要求不一致,项目需要 Java 17,但 Render 尝试使用 Java 21。
[ERROR] Fatal error compiling: error: release version 21 not supported
- 解决方案:修改
pom.xml
,指定 Java 版本,添加或修改<properties>
节点:
<properties><java.version>17</java.version>
</properties>
Render 重新部署:Render 部署失败后,无法自动重试,不用删除服务
推送新代码 ->Render Dashboard → 选择项目 → Manual Deploy → Clear Build Cache & Deploy Latest Commit
2 Docker 构建失败:工作目录不存在
错误信息:原因: Dockerfile 中 COPY
命令指定的路径错误,或者未正确生成 .jar
文件。
COPY failed: no source files were specified
3. Maven Wrapper 权限问题
问题描述:
- 错误信息:
./mvnw: Permission denied
- 原因:
mvnw
文件在 Linux 容器中没有执行权限。
解决方案:
-
在本地赋予执行权限:
chmod +x mvnw git add mvnw git commit -m "Add execute permission to mvnw" git push origin main
-
或在
Dockerfile
中添加:RUN chmod +x mvnw
总结
- Maven 未找到? → 使用 Docker 部署
-
Java 版本错误? → 修改
pom.xml
,指定<java.version>17
-
Docker COPY 失败? → 确保
target/*.jar
文件存在,路径正确 -
Render 部署失败? → Manual Deploy
-
Maven 权限问题? →
chmod +x mvnw
**推荐在Render构建时生成JAR**,而非手动上传本地JAR到GitHub。
**原因**:避免污染Git仓库(二进制文件不应纳入版本控制)。上传本地JAR无法保证JAR与代码同步,容易引发版本混乱。不符合CI/CD最佳实践。
总结关键步骤
步骤1:确保Dockerfile正确,据 `pom.xml` 中的JDK版本调整基础镜像(例如,若项目使用JDK17,需用 `maven:3.9.9-eclipse-temurin-17-focal`)。
步骤2:验证本地构建
- 在本地测试Docker镜像生成:
```bash
cd F:\git_local\Tic-Tac-Toe\backend
docker build -t oxo-backend .
```
- 确认镜像能正常运行:
```bash
docker run -p 8080:8080 oxo-backend
``·
步骤3:配置Render部署
1. 在Render创建 **Web Service**,选择GitHub仓库。
2. 指定Dockerfile路径为 `backend/Dockerfile`。
3. 设置环境变量 `PORT`(Render会自动注入值)。
4. 解决潜在问题
**问题1:JDK版本不匹配**
- **现象**:Render构建失败,提示JDK版本错误。
- **解决方案**:
- 检查 `pom.xml` 中的 `<java.version>`。
- 调整Dockerfile中的基础镜像版本,例如:
```dockerfile
FROM maven:3.9.9-eclipse-temurin-17-focal AS build # 使用JDK17
```
**问题2:依赖下载失败**
- **现象**:Maven构建时无法下载依赖。
- **解决方案**:
- 在 `pom.xml` 中明确指定仓库地址(如阿里云镜像):
```xml
<repositories>
<repository>
<id>aliyun</id>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
```
5. 最终目录与文件状态
```
Tic-Tac-Toe/
├── backend/
│ ├── src/ # 源代码
│ ├── pom.xml # 确保JDK版本配置正确
│ ├── Dockerfile # 多阶段构建配置 ✅
│ └── target/ # 本地构建生成,但.gitignore忽略 ✅
└── vue-demo/ # 前端项目(独立部署)
```
注意!!!!!!!一定一定要去docker hub的Tags页面自己查镜像
相关文章:
Render上后端部署Springboot + 前端Vue 问题及解决方案汇总
有一个 Vue 前端 和 Spring Boot 后端的动态网页游戏,当前在本地的 5173 端口和运行。你希望生成一个公开链接,让所有点击链接的人都能访问并玩这个游戏。由于游戏原本需要在本地执行 npm install 后才能启动,你现在想知道在部署时是选择 Ren…...
Linux——信号的保存与处理
前言:本文主要介绍信号的保存与处理过程。 一、信号阻塞与信号底层逻辑 在linux下面的进程控制块(PCB),存在一个pending变量用于存放接收到的信号,该变量有32位,变量的位代表信号的类别,变量的值代表是否收到信号。进程会根据该变…...
【deepseek-r1本地部署】
首先需要安装ollama,之前已经安装过了,这里不展示细节 在cmd中输入官网安装命令:ollama run deepseek-r1:32b,开始下载 出现success后,下载完成 接下来就可以使用了,不过是用cmd来运行使用 可以安装UI可视化界面&a…...
Docker Desktop Windows 安装
一、先下载Docker desktop WIndows 下载地址 二、安装 安装超简单 一路 下一步 三、安装之后,桌面会出现一个 小蓝鲸图标,打开它 》更新至最新版本,不然小蓝鲸打开,一会就退出了。 》wsl --update (这个有时比较慢…...
pytorch环境已安装库汇总
简略版总计:python pytorch nb_conda(Jupyter Notebook的插件) 创建环境conda create -n pytorch python3.8 conda install nb_conda命令...
基于Django以及vue的电子商城系统设计与实现
基于Django以及vue的电子商城系统设计与实现 引言 随着电子商务的快速发展,越来越多的企业和个人选择搭建线上商城,以提供更加便捷的购物体验。本文基于Python开发了一套电子商城系统,后端采用Django框架,前端使用Vue.js&#x…...
Spring Boot + ShardingSphere 踩坑记
最近在准备秋招,偷了个轮子项目之后想改个分表,于是有了这篇文章。 省流:请使用shardingsphere-jdbc 5.5.2,并根据官方5.5.2版本文档进行配置,不要使用starter。此外,如果希望使用INTERVAL分片算法&#x…...
【算法学习】DFS与BFS
目录 一,深度优先搜索 1,DFS 2,图的DFS遍历 (1),递归实现(隐士栈) (2),显示栈实现(非递归) 二,广度优先搜索 1,BFS 2,图的BF…...
从零到一:开发并上线一款极简记账本小程序的完整流程
从零到一:开发并上线一款极简记账本小程序的完整流程 目录 前言需求分析与功能设计 2.1 目标用户分析2.2 核心功能设计2.3 技术栈选择 开发环境搭建 3.1 微信开发者工具安装与配置3.2 项目初始化3.3 版本控制与协作工具 前端开发 4.1 页面结构与布局4.2 组件化开发…...
centos安装Nexus Repository OSS(Maven私服)
1. 下载链接:https://help.sonatype.com/en/download.html 2. 注意页面下载页面中的要求:JDK17(启动时提示最低JDK1.8最高JDK17,但是使用JDK1.8无法正常启动) 3. mkdir /opt/nexus 将压缩包上传到该目录并解压。 tar …...
Unity使用iTextSharp导出PDF-02基础结构及设置中文字体
基础结构 1.创建一个Document对象 2.使用PdfWriter创建PDF文档 3.打开文档 4.添加内容,调用文档Add方法添加内容时,内容写入到输出流中 5.关闭文档 using UnityEngine; using iTextSharp.text; using System.IO; using iTextSharp.text.pdf; using Sys…...
CSS 属性选择器详解与实战示例
CSS 属性选择器是 CSS 中非常强大且灵活的一类选择器,它能够根据 HTML 元素的属性和值来进行精准选中。在实际开发过程中,属性选择器不仅可以提高代码的可维护性,而且能够大大优化页面的样式控制。本文将结合菜鸟教程的示例,从基础…...
【漫话机器学习系列】088.常见的输出层激活函数(Common Output Layer Activation Functions)
在神经网络中,输出层(Output Layer) 的激活函数(Activation Function)直接决定了模型的输出形式,并影响损失函数的选择及训练效果。不同的任务类型(如分类或回归)需要使用不同的激活…...
STM32 HAL库 UART通讯(C语言)
1、使能UART时钟和GPIO时钟(以USART1为例): __HAL_RCC_USART1_CLK_ENABLE(); // 使能USART1时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA时钟(假设使用PA9/TX, PA10/RX) 2、GPIO配置: GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.P…...
【经验分享】Linux 系统安装后内核参数优化
在 Linux 系统安装后,进行内核优化有助于提升系统的性能、稳定性和安全性。以下是一些常见的内核优化操作: 修改/etc/sysctl.conf 文件 执行sysctl -p使配置生效。 kernel.shmmax 135185569792 kernel.shmall 4294967296 fs.aio-max-nr 3145728 fs.fi…...
【AI大模型】Ollama部署本地大模型DeepSeek-R1,交互界面Open-WebUI,RagFlow构建私有知识库
文章目录 DeepSeek介绍公司背景核心技术产品与服务应用场景优势与特点访问与体验各个DeepSeek-R系列模型的硬件需求和适用场景 Ollama主要特点优势应用场景安装和使用配置环境变量总结 安装open-webui下载和安装docker desktop配置镜像源安装open-webui运行和使用 RagFlow介绍主…...
【Java进阶打卡】JDBC-JDBC快速入门
【Java进阶打卡】JDBC-JDBC快速入门 概述快速入门 概述 快速入门 package com.itheima01;import java.sql.*;public class JDBC01 {public static void main(String[] args) throws ClassNotFoundException, SQLException {// 导入jar包 项目文件下面 创建libs文件夹 该ja…...
CEF132 编译指南 MacOS 篇 - depot_tools 安装与配置 (四)
1. 引言 在 CEF132(Chromium Embedded Framework)的编译过程中,depot_tools 扮演着举足轻重的角色。这套由 Chromium 项目精心打造的脚本和工具集,专门用于获取、管理和更新 Chromium 及其相关项目(包括 CEFÿ…...
缓存机制与 Redis 在高性能系统中的应用
引言 随着互联网应用日益增长,用户对系统的响应速度和稳定性提出了更高的要求。在高并发、大流量的场景下,数据库的读取压力会急剧上升,导致数据库的响应速度变慢,甚至引发性能瓶颈。为了缓解这一问题,缓存机制成为了…...
WinForm 防破解、反编译设计文档
一、引言 1.1 文档目的 本设计文档旨在阐述 WinForm 应用程序防破解、反编译的设计方案,为开发团队提供详细的技术指导,确保软件的知识产权和商业利益得到有效保护。 1.2 背景 随着软件行业的发展,软件破解和反编译现象日益严重。WinForm…...
晶闸管主要参数分析与损耗计算
1. 主要参数 断态正向可重复峰值电压 :是晶闸管在不损坏的情况下能够承受的正向最大阻断电压。断态正向不可重复峰值电压 :是晶闸管只有一次可以超过的正向最大阻断电压,一旦晶闸管超过此值就会损坏,一般情况下 反向可重复峰值电压 :是指晶闸管在不损坏的情况下能够承受的…...
基于Python的人工智能驱动基因组变异算法:设计与应用(上)
一、引言 1.1 研究目标与内容 本研究旨在设计并应用基于 Python 的人工智能驱动的基因组变异算法,以应对基因组学研究中日益增长的数据挑战,提高对基因组变异的理解和应用能力。主要研究内容包括: 数据预处理:利用 Python 的 Biopython、pandas 等库,对来自公共数据库(…...
自己部署DeepSeek 助力 Vue 开发:打造丝滑的标签页(Tabs)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 自己…...
Python+appium实现自动化测试
目录 一、工具与环境准备 二、开始测试 1、插上手机,打开usb调试,选中文件传输,我这里用华为手机为例 2、启动Appium Server GUI编辑 3、启动 Inspector Session 4、录制脚本 使用Python和Appium进行自动化测试是一种常见的移动应用…...
解锁大语言模型潜能:KITE 提示词框架全解析
大语言模型的应用日益广泛。然而,如何确保这些模型生成的内容在AI原生应用中符合预期,仍是一个需要不断探索的问题。以下内容来自于《AI 原生应用开发:提示工程原理与实战》一书(京东图书:https://item.jd.com/1013604…...
GPT-SWARM和AgentVerse的拓扑结构和交互机制
GPT-SWARM和AgentVerse的拓扑结构和交互机制 拓扑结构区别 GPT-SWARM:采用图结构,将语言智能体系统描述为可优化的计算图。图中的每个节点代表一个操作,如语言模型推理或工具使用等特定功能,边则描述了操作之间的信息流,代表智能体之间的通信渠道。多个智能体连接形成的复…...
undetected-chromedriver 使用教程,指定浏览器驱动和浏览器版本
前言 浏览器自动化测试,测试过一些网站检测 目录 前言1. 安装 undetected-chromedriver2. 基本使用示例代码:代码解析: 3. 反自动化检测绕过自定义浏览器设置示例:使用自定义 User-Agent示例:启用无头模式(…...
cmake
一. 是什么 cmake是一个跨平台的构建工具。 跨平台:可以在linux,windows,macos中使用。 构建工具:cmake不直接参与编译,而是生成平台相应的构建工具。比如:linux下的makefile,windows下的.sln(解…...
Linux高并发服务器开发 第十七天(管道缓存区查询大小 管道的优劣 命名管道mkfifo 建立释放映射区mmap/munmap 匿名映射 进程间的通信)
目录 1.pipe管道读写行为 1.1例题:实现父子进程 ls | wc -l 1.2兄弟进程 ls | wc -l 2.管道缓存区 2.1命令查询 2.2函数查询 3.pipe管道的优劣 4.命名管道 fifo 5.mmap 5.1文件进程间通信 5.2建立、释放映射区 5.3匿名映射 6.进程间通信 6.1父子进间通…...
windows系统远程桌面连接ubuntu18.04
记录一下自己在配置过程中遇到的问题,记录遇到的两大坑: windows系统通过xrdp远程桌面连接ubuntu18.04的蓝屏问题。参考以下第一章解决。 同一局域网内网段不同的连接问题。参考以下第三章解决,前提是SSH可连。 1. 在ubuntu上安装xrdp 参考&…...
SQLMesh系列教程-2:SQLMesh入门项目实战(下篇)
上篇我介绍了环境搭建、duckdb数据准备、sqlmesh数据模型、plan命令运行。本文继续介绍审计、测试、生成血缘关系以及python模型等。 有两种方法可以在SQLMesh中创建宏。一种方法是使用Python,另一种方法是使用Jinja。这里我们创建Python宏。让我们构建简单的Python…...
ThinkPHP8视图赋值与渲染
【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 在控制器操作中,使用view函数可以传入视图…...
tkinter-TinUI-xml实战(12)应用组启动器
tkinter-TinUI-xml实战(12)应用组启动器 引言主界面单独条目 编辑框命令行指令子任务指令 演示题外话 引言 应用快捷启动器有很多现成软件,但是大多都是将常用软件分类,或者建立一个个包含一套工作、学习环境的软件类区ÿ…...
MySQL隐式转换介绍、常见场景和导致问题、示例代码
概述 MySQL 中的 隐式类型转换 是指在某些操作中,MySQL 会自动将数据的类型转换为另一种类型,以便完成操作。虽然这种特性在某些情况下很方便,但也可能导致性能问题、数据丢失或意外的查询结果。 1. 什么是隐式类型转换? 隐式类…...
Quartz定时任务
官网:http://www.quartz-scheduler.org/ OpenSymphony 开源组织在Job scheduling领域的一个开源项目,基于java实现的任务调度框架 设计模式:Builder模式、Factory模式、组件模式、链式编程 核心概念: 任务Job 想要实现的任务…...
【C++八股】静态局部变量/全局变量/局部变量的区别和使用场景
1. 静态局部变量 (Static Local Variable) 作用域:静态局部变量的作用域仅限于函数或代码块内部,就像普通局部变量一样,但其生命周期不同。生命周期:静态局部变量的生命周期是整个程序的运行期间,它只会在第一次调用时…...
飞算 JavaAI:加速 AI + 行业趋势的智能化进程
在数字化浪潮奔涌的当下,“AI 行业” 已然成为不可逆的发展趋势,各行业都在积极探索 AI 技术与自身业务的融合,期望借此实现创新突破与转型升级。在这一进程中,飞算 JavaAI凭借其卓越的技术实力和独特的功能优势,为加…...
【Elasticsearch入门到落地】7、文档操作
接上篇《6、索引库的操作》 上一篇我们学习了ElasticSearch的索引库的操作,以及mapping映射属性以及CRUD操作。本篇我们来学习文档的薪资、查询、删除和修改操作。 上一篇我们建立了索引库,库有了我们就可以往里面添加数据了,然后对文档进行…...
【算法】【双指针】acwing算法基础 2816. 判断子序列
题目 给定一个长度为 n 的整数序列 a1,a2,…,an 以及一个长度为 m 的整数序列 b1,b2,…,bm。 请你判断 a 序列是否为 b 序列的子序列。 子序列指序列的一部分项按原有次序排列而得的序列,例如序列 {a1,a3,a5} 是序列 {a1,a2,a3,a4,a5} 的一个子序列。 输入格式 第一…...
【Unity3D】Jenkins Pipeline流水线自动构建Apk
目录 一、准备阶段 二、创建Pipeline流水线项目 三、注意事项 一、准备阶段 1、安装tomcat 10.0.5 Index of apache-local/tomcat/tomcat-10 2、安装jdk 17 Java Archive Downloads - Java SE 17.0.13 and later 3、下载Jenkins 2.492.1 (.war)包 War Jenkins Packa…...
Openssl的使用,CA证书,中间证书,服务器证书的生成与使用
证书教程 1、Openssl相关文档2、生成证书命令初步解释3、准备openssl的配置文件 openssl.cnf4、证书生成4.1、生成根证书、CA根证书、自签名证书4.2、生成服务器证书4.3、生成中间证书4.3、使用中间证书生成服务器证书5、使用openssl操作证书5.1 查看证书内容5.2 进行证书测试5…...
HCIA项目实践--静态路由的综合实验
八 静态路由综合实验 (1)划分网段 # 192.168.1.0 24#分析:每个路由器存在两个环回接口,可以把两个环回接口分配一个环回地址,所以是四个环回,一个骨干,这样分配,不会出现路由黑洞#19…...
VSCode中出现“#include错误,请更新includePath“问题,解决方法
1、出现的问题 在编写C程序时,想引用头文件但是出现如下提示: (1)首先检查要引用的头文件是否存在,位于哪里。 (2)如果头文件存在,在编译时提醒VSCode终端中"#include错误&am…...
鸿蒙HarmonyOS NEXT开发:优化用户界面性能——组件复用(@Reusable装饰器)
文章目录 一、概述二、原理介绍三、使用规则四、复用类型详解1、标准型2、有限变化型2.1、类型1和类型2布局不同,业务逻辑不同2.2、类型1和类型2布局不同,但是很多业务逻辑公用 3、组合型4、全局型5、嵌套型 一、概述 组件复用是优化用户界面性能&#…...
如何使用deepseek等AI工具辅助web后端工作的开发
使用DeepSeek等AI工具辅助Web后端开发可以显著提升效率,以下是具体应用场景和操作指南: 一、核心开发场景 代码生成与补全示例场景:快速生成CRUD接口 操作:输入提示词 用Node.js Express框架编写用户管理模块,要求: - RESTful API设计 - 包含创建/查询/更新/删除接口 - …...
嵌入式音视频开发(一)ffmpeg框架及内核解析
系列文章目录 嵌入式音视频开发(零)移植ffmpeg及推流测试 嵌入式音视频开发(一)ffmpeg框架及内核解析 文章目录 系列文章目录前言一、ffmpeg的内核1.1 框架解析1.2 内核解析1.3 FFmpeg内部数据流1.3.1 典型的解码流程1.3.2 典型的…...
MFC线程安全案例
作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、项目解析 二…...
spring cloud和spring boot的区别
Spring Cloud和Spring Boot在Java开发领域中都是非常重要的框架,但它们在目标、用途和实现方式上存在明显的区别。以下是对两者区别的详细解析: 1. 含义与定位 Spring Boot: 是一个快速开发框架,它简化了Spring应用的初始搭建以…...
探索后端开发中的异步API:基于Resilience4j与Reactive Programming的高性能设计
引言 随着微服务架构的普及,后端系统面临的挑战愈发严峻,尤其是在高并发和高可用性方面。传统的同步调用模式虽然简单,但在处理大量并发请求时可能会成为瓶颈。为了应对这一问题,异步编程逐渐成为后端开发的热门话题。 在本文中…...
JDK 17 和 JDK 21 在垃圾回收器(GC)上有什么优化?如何调整 GC 算法以提升应用性能?
JDK 17 和 JDK 21 在垃圾回收器(GC)上有什么优化?如何调整 GC 算法以提升应用性能? 本文将从 JDK 17 与 JDK 21 的垃圾回收改进出发,结合代码示例解析优化方案,并提供实际项目中的调优策略,帮助…...