jar 包启动报错

启动

0.启动规则:启动命令 启动参数 jar包 端口
1.正常启动 :java -jar xxxx-item.jar
2.加参数启动: java -jar -Xms512M -Xmx 2048 xxxx-item.jar
3.加端口启动: java -jar xxxx-item.jar --server.port = port (不常用)

问题及解决方案

启动前

情况一:
1.启动命令错误(两种情况)
启动命令错误
2.启动后直接退出
启动未完成直接退出
排查:输入jps 命令
看到有jar包已启动jps查询运行的进程
杀掉进程 : taskkill /pid 13944 -f

杀掉进程
再次启动:↑ 向上找到启动命令
启动成功
情况二
1.如上所说,但是端口并没有占用
2.不管你用的开发工具是idea ,eclipse,还是 sts,本地启动
3.本地不能启动,排查问题,是不是那个module 未依赖,某个 entity未写完整,缺少依赖
4.保证本地正常启动
5.如果还是不能启动,那是因为,打成jar包后,里面是最优的依赖关系,jar包依赖了某些未开发好的模块,去掉该模块,重新打包ok

启动中(只考虑jar包的情况)
上面的只是成功的前提,接下来需要经受测试的考验
  a. 常见问题前端访问404 路径找不到
   情况一: 看是某一模块的404还是某一接口的404
   <1> 若是某一模块访问404,找到服务器上启动的jar包
   <2>鼠标右键用压缩工具zip,WinRAR 打 开

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
看看是否缺某模块的依赖jar包
若不缺说明打jar包出问题了,看看聚合工程pom文件是否含有这样的配置
mainClass 主入口配置
在这里插入图片描述
这样的原因是,你指定了多个主路口,所以路径不对,注释掉该404模块改属性,就可以
若缺某模块的jar包或者某个新写的接口404,操作如下
maven命令讲解
操作完就可以正常启动。谢谢!

<think>我们面对的问题:在使用Docker Compose启动项目时,防止因中间件(如数据库、消息队列等)未完全启动导致的JAR启动错误。 解决方案思路:我们需要确保在启动JAR(即应用服务)之前,它所依赖的中间件服务已经启动并且处于就绪状态(不仅仅是运行状态,还要能够接受连接)。 Docker Compose本身提供了一些机制来控制服务启动顺序,但默认情况下,它只保证容器按依赖顺序启动,而不保证容器内的服务进程已经就绪。 因此,我们需要使用健康检查(healthcheck)和依赖条件(depends_on)来确保一个服务在另一个服务就绪后再启动。 具体步骤: 1. 为每个中间件服务(如MySQL、Redis等)定义健康检查,以检测服务是否真正就绪。 2. 在应用服务(JAR)的配置中,使用`depends_on`指定依赖的中间件服务,并设置条件为健康状态(`condition: service_healthy`)。 示例: 假设我们有一个docker-compose.yml文件,含一个MySQL服务和一个Spring Boot应用服务(JAR)。 首先,为MySQL服务添加健康检查: ```yaml services: mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 5s timeout: 10s retries: 10 ``` 然后,在应用服务中设置依赖: ```yaml app: image: my-app:latest depends_on: mysql: condition: service_healthy command: java -jar /app.jar ``` 这样,只有当MySQL服务通过健康检查(即`mysqladmin ping`命令成功)后,app服务才会启动。 注意:对于其他中间件(如Redis、MongoDB等),也需要定义相应的健康检查命令。 另外,如果应用需要多个中间件,则应该为每个依赖的中间件服务都设置健康检查,并在app的depends_on中列出所有依赖,并设置条件。 例如,如果还依赖Redis: ```yaml redis: image: redis:alpine healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 10s retries: 10 app: depends_on: mysql: condition: service_healthy redis: condition: service_healthy ``` 这样,只有MySQL和Redis都健康后,app才会启动。 重要:在Docker Compose的v2.1及以上版本中,支持`condition`语法。请确保你的Compose文件版本至少为2.1(在文件开头指定`version: '2.1'`或更高版本,如`version: '3'`或`version: '3.8'`等,但需要注意,在3.x版本中,depends_on下的condition语法在v3.0到v3.4被移除了,在v3.5及以后又重新支持。因此建议使用3.5以上版本)。 如果你的Compose文件版本是3.x,可以这样写: ```yaml version: '3.8' services: # ... 其他服务 app: depends_on: mysql: condition: service_healthy redis: condition: service_healthy ``` 另外,还可以使用工具如`wait-for-it`或`dockerize`在应用启动命令前等待依赖服务就绪。这种方法在Compose文件版本较低时也适用,或者当健康检查不能满足复杂需求时使用。 例如,使用wait-for-it脚本(需要将脚本放入容器中): ```yaml app: image: my-app:latest depends_on: - mysql - redis command: ["./wait-for-it.sh", "mysql:3306", "--", "java", "-jar", "/app.jar"] ``` 但这种方法需要你的应用镜像中含wait-for-it.sh脚本,并且需要知道每个依赖服务的地址和端口。 总结:推荐使用健康检查与depends_on条件结合的方式,这是Docker Compose原生支持的方法。 参考文档: [Docker Compose depends_on condition](https://docs.docker.com/compose/compose-file/compose-file-v3/#depends_on) [Control startup order in Compose](https://docs.docker.com/compose/startup-order/)</think>### 确保 Docker Compose 启动顺序的正确方法 在使用 Docker Compose 启动项目时,避免因中间件(如数据库、消息队列等)未完全启动导致的 JAR 启动错误,可通过以下方案实现: --- #### 1. **使用健康检查 (Healthcheck)** 在 Compose 文件中为中间件服务定义健康检查,确保应用容器仅在中间件就绪后启动: ```yaml services: mysql: image: mysql:8.0 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 5s timeout: 3s retries: 10 redis: image: redis:alpine healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s app: image: my-app:latest depends_on: mysql: condition: service_healthy # 关键:等待 MySQL 健康 redis: condition: service_healthy # 关键:等待 Redis 健康 command: java -jar /app.jar ``` **原理**: - `healthcheck` 定义中间件的就绪检测命令(如 MySQL 的 `mysqladmin ping`)。 - `depends_on` 的 `condition: service_healthy` 确保应用容器仅在依赖服务通过健康检查后启动[^1]。 --- #### 2. **启动脚本控制顺序** 在应用容器中使用脚本检测依赖服务端口就绪: ```bash #!/bin/sh # wait-for.sh 脚本 set -e host="$1" port="$2" shift 2 cmd="$@" until nc -z $host $port; do echo "等待 $host:$port..." sleep 2 done exec $cmd ``` 在 Compose 中调用脚本: ```yaml app: image: my-app:latest volumes: - ./wait-for.sh:/wait-for.sh # 挂载脚本 command: - sh - -c - "/wait-for.sh mysql 3306 -- java -jar /app.jar" # 等待 MySQL 就绪 depends_on: - mysql ``` --- #### 3. **使用 `restart: on-failure` 策略** 配置应用容器在启动失败后自动重试: ```yaml app: image: my-app:latest restart: on-failure # 启动失败时自动重试 depends_on: - mysql ``` --- #### 4. **调整 Compose 启动参数** 启动时强制重建容器并延长超时时间: ```bash docker-compose up -d --force-recreate --timeout 30 # 延长超时到 30 秒 ``` --- ### 方案对比 | **方法** | **适用场景** | **优点** | **缺点** | |------------------|----------------------------------|-----------------------------------|------------------------| | 健康检查 | 所有支持健康检查的中间件 | Docker 原生支持,无需额外脚本 | 需中间件支持检测命令 | | 启动脚本 | 复杂依赖或自定义检测逻辑 | 灵活控制检测逻辑 | 需维护脚本 | | 重启策略 | 简单依赖场景 | 配置简单 | 可能多次失败后启动 | | 延长超时 | 中间件启动较慢 | 快速实施 | 不保证服务完全就绪 | > **最佳实践**:**健康检查 + `depends_on` 条件依赖**是最可靠的方案,符合 Docker 原生设计模式[^1][^2]。 --- ### 常见中间件健康检查示例 ```yaml # PostgreSQL healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s # RabbitMQ healthcheck: test: ["CMD", "rabbitmq-diagnostics", "check_port_connectivity"] interval: 10s # MongoDB healthcheck: test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"] ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值