当前位置: 首页 > article >正文

Render上后端部署Springboot + 前端Vue 问题及解决方案汇总

有一个 Vue 前端 和 Spring Boot 后端的动态网页游戏,当前在本地的 5173 端口和运行。你希望生成一个公开链接,让所有点击链接的人都能访问并玩这个游戏。由于游戏原本需要在本地执行 npm install 后才能启动,你现在想知道在部署时是选择 Render 还是 Heroku,并且哪一个能支持你的 Spring Boot 后端。最后,你需要知道选择其中一种平台后,每一步具体的部署流程是什么。

部分需要创建Render 类型Root DirectoryBuild CommandStart Command / Publish Directory
后端 (Spring Boot)1 次Web Servicebackend/(如果有的话)mvn clean installjava -jar target/your-app.jar
前端 (Vue 3)1 次Static Sitefrontend/(如果有的话)npm install && npm run builddist

注意:

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 代码正确
  1. application.properties 里加上server.port=${PORT:8080} 这样 Render 就能正确读取 PORT 环境变量,不用再手动指定端口

    server.port=${PORT:8080}
    
  2. 检查 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>
    
  3. 把这些改动 push 到 GitHub


第二步:在 Render 上创建 Web Service
  1. 点击“New Web Service” 连接 GitHub 并选择你的后端项目仓库。
  2. 填写部署配置
    • Build Command(构建命令):
      mvn clean install
      
    • Start Command(启动命令):
      java -jar target/your-app.jar
      

总结: 

  • 在 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 installjava -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. 创建 Dockerfilebackend/ 目录下创建 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 的镜像,原因如下:

  1. Spring Boot 没有官方基础镜像
    Spring Boot 本身是一个基于 Java 的框架,其运行依赖 JDK/JRE 环境,而不是独立的操作系统或运行时。因此,构建 Spring Boot 应用的 Docker 镜像时,应选择 JDK 或 JRE 基础镜像(如 openjdkeclipse-temurin),而非虚构的 "Spring Boot 镜像"310。

  2. 构建与运行分离的多阶段构建需求
    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 中可以使用 ARGENV 传递变量,但 EXPOSE 通常要求写定一个静态的端口号,因为它的作用主要是用于说明和自动文档生成,而不是实现真正的端口绑定。同时,在运行时,端口映射完全依赖于你在 docker run 命令中指定的 -p 参数。
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}:此行用于声明容器将监听的端口。问题在于:如果没有通过 ENVPORT 设置到运行环境中,可能不会按预期替换变量。另外,EXPOSE 指令只用于文档化目的,不会进行实际的端口映射。
    • CMD ["sh", "-c", "java -jar /app.jar --server.port=${PORT}"]:这一行用来启动应用,并将 --server.port=${PORT} 传递给应用。如果 PORT 没有被正确导入到环境变量中,shell 命令中的 ${PORT} 可能无法按预期替换。
  1. 原 Dockerfile 中 COPY ../target/*.jar 在多阶段构建中无效,需通过 --from=build 直接从构建阶段复制文件
  2. 明确指定 JAR 文件:避免 .original 文件匹配问题。
  3. ENV 解决 PORT 变量解析问题ENV SERVER_PORT=${PORT}CMD 解析变量。
  4. EXPOSE 8080:不能用 ${PORT},只能静态声明,动态端口映射要用 docker run -p
  5. WORKDIR /app 让文件结构更清晰:所有文件都在 /app 下。
  6. 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 上部署时:

    • 你无需手动做 Docker 的端口映射,因为 Render 的平台会自动把外部流量转发到你容器内监听的那个端口(即 $PORT 指定的端口)。Render 的文档建议你的容器务必使用环境变量指定的端口来启动服务,否则外部请求无法正确路由到你的应用。

回答你的具体问题

问题 1:在本地运行、容器化后的情况
  • 本地运行:Spring Boot 默认监听 8080,只有一个服务器(你的本机 OS),端口 8080 由 Spring Boot 占用。
  • 容器化后
    1. 容器内部:Spring Boot 应用依然在容器内部监听 8080(或配置的端口);这属于容器的私有网络。
    2. 宿主机(Docker 主机):如果你使用 docker run -p 8080:8080 映射端口,则宿主机的 8080 端口会把外部请求转发到容器的 8080。
    3. 设置时,在 Dockerfile 中用 EXPOSE 8080 仅做声明,而实际映射在运行容器时通过 -p 参数指定。
    4. 端口 8080 在容器内部是由 Spring Boot 占用;在宿主机上则由 Docker 端口映射起到转发作用。
    5. 因此,在容器化环境下,从外部看,你有两个网络层次:宿主机端口(映射层)和容器内的服务端口。

问题 2:部署到 Render 后
  • 部署到 Render 上时,Render 平台会为你的服务提供一个外部入口和 URL,同时通过环境变量(通常为 PORT)告知你的容器应监听哪个端口。
    1. 容器内部:你的 Spring Boot 应用需要根据环境变量启动,例如使用命令 java -jar /app.jar --server.port=$PORT,这样无论 Render 分配哪个端口,应用都能正确监听。
    2. Render 平台:在 Render 的基础设施中,外部用户访问的是 Render 提供的 URL,Render 的负载均衡器或反向代理会把请求转发到容器内部监听的那个端口。
    3. 整个过程中,你实际上只需要确保容器内部监听的是 Render 指定的端口;外部的端口映射由 Render 自动管理。
    4. 所以,部署到 Render 后:
      • 内部服务端口:由环境变量 $PORT 决定,可能默认是 8080,但 Render 可能分配其他值。
      • 外部入口:由 Render 提供和管理,用户只需通过 Render 提供的 URL 访问,不必关心具体端口。
# 定义运行时端口,并将构建参数转换为环境变量
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)指的是宿主机将接收到的请求,自动传递到容器内部的对应端口。

  1. 服务器(Server): 监听某个端口(例如 8080),等待客户端请求。
  2. 客户端(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

Docker 构建失败:工作目录不存在

错误信息:原因: Dockerfile 中 COPY 命令指定的路径错误,或者未正确生成 .jar 文件。

COPY failed: no source files were specified

3. Maven Wrapper 权限问题

问题描述:

  • 错误信息:
    ./mvnw: Permission denied
    
  • 原因: mvnw 文件在 Linux 容器中没有执行权限。

解决方案:

  1. 在本地赋予执行权限:

    chmod +x mvnw
    git add mvnw
    git commit -m "Add execute permission to mvnw"
    git push origin main
    
  2. 或在 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 后端的动态网页游戏&#xff0c;当前在本地的 5173 端口和运行。你希望生成一个公开链接&#xff0c;让所有点击链接的人都能访问并玩这个游戏。由于游戏原本需要在本地执行 npm install 后才能启动&#xff0c;你现在想知道在部署时是选择 Ren…...

朝天椒USB服务器:解决加密狗远程连接

本文探讨朝天椒USB服务器用Usb Over Network技术&#xff0c;解决加密狗在虚拟机、云主机甚至异地的远程连接问题。 在企业数字化转型的浪潮中&#xff0c;加密狗作为防止软件盗版的重要手段&#xff0c;广泛应用于各类软件授权场景。然而&#xff0c;随着企业超融合进程不断加…...

Unity Shader Feature

Shader Feature 设置Keyword //0:Red 1:Green 2:Blue Mat.SetInt(“_Color”,0); 需要在创建时进行设置&#xff0c;运行时不可设置 Shader "Unlit/KeywordEnum" {Properties{[KeywordEnum(Red,Green,Blue)] _Color("Color",int) 0}SubShader{Pass{HLSL…...

前端开发环境

vscde nrm 切换源管理 nvm 切换node版本工具 nodemon node运行js文件热更新 pxcook 易用的自动标注工具, 生成前端代码, 设计研发协作利器,比PS轻量 TypeScript 安装tsc 它的作用就是将ts文件编译为js文件 npm i typescript -g 输入tsc -v能够看到东西&#xff0c;就说明好了 …...

c语言判断一个文件的文件格式

在 Linux 下使用 C 语言判断一个文件的文件格式&#xff0c;通常需要检查文件的头信息&#xff08;也称为“幻数”或“魔数”&#xff09;。不同的文件格式在文件头有特定的字节序列&#xff0c;这些字节序列可以用来确定文件的类型。以下是一个基本的示例&#xff0c;展示了如…...

厘米和磅的转换关系

在排版和设计领域&#xff0c;厘米&#xff08;cm&#xff09;和磅&#xff08;pt&#xff09;都是常用的长度度量单位&#xff0c;它们之间的转换关系基于特定的换算标准&#xff0c;下面为你详细介绍&#xff1a; 基本换算关系 磅是印刷行业常用的长度单位&#xff0c;1英寸…...

汽车与AI深度融合:CES Asia 2025前瞻

在科技飞速发展的当下&#xff0c;汽车与AI的融合正成为行业变革的关键驱动力。近日&#xff0c;吉利、极氪、岚图、智己等多家车企纷纷官宣与DeepSeek模型深度融合&#xff0c;其中岚图知音更是将成为首个搭载该模型的量产车型&#xff0c;这无疑是汽车智能化进程中的重要里程…...

用easyExcel如何实现?

要使提供的 ExcelModelListener 类来解析 Excel 文件并实现批量存储数据库的功能&#xff0c;需要结合 EasyExcel 库来读取 Excel 数据。具体来说&#xff0c;可以使用 EasyExcel.read() 方法来读取 Excel 文件&#xff0c;并指定 ExcelModelListener 作为事件监听器。 下面是…...

停止回答 TypeError: (0 , _vue.defineComponent) is not a function

在 Vue.js 中遇到 TypeError: (0 , _vue.defineComponent) is not a function 错误通常意味着 defineComponent 函数没有被正确导入或者你的 Vue 版本不支持该函数。 解决步骤 检查 Vue 版本 defineComponent 是 Vue 3 中的一个功能&#xff0c;用于创建组件。确保你正在使用…...

数据结构与算法-单链表

链表 参考学习&#xff1a;B站-逊哥带你学编程 单链表 单链表-存储结构 typedef int ElemType;typedef struct node{ElemType data;struct node *next; }Node;单链表-初始化 Node *initList() {Node *head (Node *)malloc(sizeof(Node));head->data 0;head->next …...

ASP.NET Core 如何使用 C# 向端点发出 POST 请求

使用 C#&#xff0c;将 JSON POST 到 REST API 端点&#xff1b;如何从 REST API 接收 JSON 数据。 本文需要 ASP .NET Core&#xff0c;并兼容 .NET Core 3.1、.NET 6和.NET 8。 要从端点获取数据&#xff0c;请参阅本文。 使用 . 将 JSON 数据发布到端点非常容易HttpClien…...

DeepSeek模型R1服务器繁忙,怎么解决?

在当今科技飞速发展的时代&#xff0c;人工智能领域不断涌现出令人瞩目的创新成果&#xff0c;其中DeepSeek模型无疑成为了众多关注焦点。它凭借着先进的技术和卓越的性能&#xff0c;在行业内掀起了一股热潮&#xff0c;吸引了无数目光。然而&#xff0c;如同许多前沿技术在发…...

GlusterFS 深度洞察:从架构原理到案例实践的全面解读(上)

文章目录 一.GlusterFS简介二.GlusterFS原理架构三.适用场景四.Glusterfs与其他存储产品对比五.部署GlusterFS集群六. 使用heketi将glusterfs接入k8s作为后端存储 一.GlusterFS简介 GlusterFS是一个免费的开源分布式文件系统&#xff0c;具有无中心节点、堆栈式设计、全局统一…...

更新无忧:用 Docker 数据卷确保 Open WebUI 数据持久化

在使用 Docker 部署 Open WebUI 时&#xff0c;如何在更新容器的同时确保数据不丢失&#xff0c;始终是工程师们关注的焦点。每次拉取新版镜像、停止并重启容器时&#xff0c;如果没有正确挂载数据卷&#xff0c;配置和数据库数据极易流失&#xff0c;给生产环境带来不必要的麻…...

zyNo.22

常见Web漏洞解析 命令执行漏洞 1.Bash与CMD常用命令 &#xff08;1&#xff09;Bash 读取文件&#xff1a;最常见的命令cat flag 在 Bash 中&#xff0c;cat 以及的tac、nl、more、head、less、tail、od、pr 均为文件读取相关命令&#xff0c;它们的区别如下&#xff1a; …...

idea如何使用AI编程提升效率-在IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤-卓伊凡

idea如何使用AI编程提升效率-在IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤-卓伊凡 问题 idea编译器 安装copilot AI工具 实际操作 在 IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤如下&#xff1a; 打开 IntelliJ IDEA&#xff1a; 打开你的 IntelliJ IDEA 应用…...

有哪些PHP开源框架属于是“高开疯走”的?

“高开疯走”是一个网络流行语或者谐音梗。可能是指一开始起点很高&#xff08;高开&#xff09;&#xff0c;然后发展迅速或者变得非常牛&#xff08;疯走&#xff09;。 在PHP生态中&#xff0c;一些框架面对市场的风起云涌&#xff0c;能持续保持高质量发展&#xff0c;切实…...

C# ASP.NET核心特性介绍

.NET学习资料 .NET学习资料 .NET学习资料 在当今的软件开发领域中&#xff0c;C# ASP.NET凭借其强大的功能和丰富的特性&#xff0c;成为构建 Web 应用程序的重要技术之一。以下将详细介绍 C# ASP.NET的核心特性。 多语言支持 ASP.NET 支持多种语言进行开发&#xff0c;这使…...

在 Linux 系统下,解压 `.tar.gz`

在 Linux 系统下,解压 .tar.gz 文件通常使用 tar 命令。.tar.gz 文件是一种压缩归档文件,它首先使用 tar 命令将多个文件打包为一个 .tar 文件,然后再使用 gzip 压缩生成 .tar.gz 文件。 解压 .tar.gz 文件的命令 要解压 .tar.gz 文件,可以使用以下命令: tar -xzvf fil…...

Unity 接入Tripo 文生模型,图生模型

官方网站&#xff1a;https://www.tripo3d.ai/app/home自行注册账号并且登陆下载Unity插件&#xff1a;https://cdn-web.tripo3d.ai/plugin/tripo-unity.zip申请apikey&#xff1a; https://platform.tripo3d.ai/api-keys使用&#xff08;后续过程就按照第二步下载的插件里面的…...

WPS计算机二级•文档的文本样式与编号

听说这是目录哦 标题级别❤️新建文本样式 快速套用格式&#x1fa77;设置标题样式 自定义设置多级编号&#x1f9e1;使用自动编号&#x1f49b;取消自动编号&#x1f49a;设置 页面边框&#x1f499;添加水印&#x1fa75;排版技巧怎么分栏&#x1f49c;添加空白下划线&#x…...

安卓使用JExcelApi读取Excel文件

要在安卓应用中使用JExcelApi读取Excel文件&#xff0c;你需要先确保你的项目中已经添加了JExcelApi的依赖。由于安卓项目的构建方式多样&#xff0c;这里以使用Gradle为例来介绍如何在安卓应用中集成和使用JExcelAPI。 ### 步骤1: 添加依赖 首先&#xff0c;在你的build.gra…...

外部中断实验 #STM32F407

外部中断实验 此实验将外部中断配置为按键输入&#xff0c;通过按键输入触发外部中断&#xff0c;在外部中断里面实施相应的处理&#xff0c;具体功能&#xff1a; 按下KEY0&#xff0c;翻转LED0状态按下KEY1&#xff0c;翻转LED1状态按下KEY2&#xff0c;同时翻转LED0和LED1…...

kafka了解-笔记

文章目录 kafka快速上手Kafka介绍Kafka快速上手理解Kafka的集群工作机制Kafka集群的消息流转模型 Kafka客户端小型流转流程客户端工作机制 kafka快速上手 Kafka介绍 MQ的作用 MQ&#xff1a;MessageQueue&#xff0c;消息队列&#xff0c;是一种FIFO先进先出的数据结构&#…...

渗透利器:Burp Suite 联动 XRAY 图形化工具.(主动扫描+被动扫描)

Burp Suite 联动 XRAY 图形化工具.&#xff08;主动扫描被动扫描&#xff09; Burp Suite 和 Xray 联合使用&#xff0c;能够将 Burp 的强大流量拦截与修改功能&#xff0c;与 Xray 的高效漏洞检测能力相结合&#xff0c;实现更全面、高效的网络安全测试&#xff0c;同时提升漏…...

解决QTimer报“Timers cannot be started from another thread“错误

今天在Qt编程时&#xff0c;将QTimer在子线程里执行start()函数&#xff0c;遇到“Timers cannot be started from another thread”问题&#xff0c;使用了如下AI工具&#xff0c;进行查询&#xff1a;     提示词A&#xff1a;“C QTimer 如何跨线程”     提示词B&#…...

vant4 van-list组件的使用

<van-listv-if"joblist && joblist.length > 0"v-model:loading"loading":finished"finished":immediate-check"false"finished-text"没有更多了"load"onLoad">// 加载 const loading ref(fals…...

C++11新特性之weak_ptr智能指针

本节介绍最后一个智能指针——weak_ptr智能指针。 1.介绍 weak_ptr智能指针也是以模板类的方式实现的。同样定义在<memory>头文件&#xff0c;并位于std命名空间中。在使用前需包含这两条语句。 C11虽然将weak_ptr当做智能指针&#xff0c;但该类型通常不单独使用&#…...

LM Studio无设置代理,更改镜像源方法(MAC)

在macbook上使用LM Studio时发现总是加载失败&#xff0c;App也没有设置代理的地方&#xff0c;搜索了挺多解决方案&#xff0c;貌似官网再可以封补很多解决方案已经过时&#xff0c;最终找到一种替换镜像源的方法共享出来。 方便大家都能使用&#xff0c;不介绍命令行修改方式…...

js中的== 和 ===运算符的比较和区别(面试题)

和 运算符用于比较 JavaScript 值是否相等。 自动转换数据类型&#xff0c;允许不同类型值的比较。 进行严格相等比较&#xff0c;仅在值和数据类型都相同的情况下返回 true。NaN 仅在 比较中与自身相等&#xff0c;而在 比较中不相等。null 和 undefined 仅在 比较中相等。…...