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

es 书籍检索-下篇 - 内网部署工程

前言
本篇文章主要整理下内网,不联网情况下部署前后端工程遇到的一些问题

后端工程打成jar包

问题 1、内网情况下构建jar包很容易遇见缺失依赖
采用mvn install方式去安装缺失依赖
# 1. jakarta.json
mvn install:install-file -Dfile=/mnt/data/maven-offline-jars/jakarta.json-2.0.1.jar \-DgroupId=org.glassfish \-DartifactId=jakarta.json \-Dversion=2.0.1 \-Dpackaging=jar# 2. pagehelper
mvn install:install-file -Dfile=/mnt/data/maven-offline-jars/pagehelper-spring-boot-starter-1.4.7.jar \-DgroupId=com.github.pagehelper \-DartifactId=pagehelper-spring-boot-starter \-Dversion=1.4.7 \-Dpackaging=jar问题 2、依赖冲突问题,Error org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer -Consumer thread error, thread abort. java.lang.BootstrapMethodError:java.lang.IllegalAccessError:no such constructor: org.apache.poi.xssf.usermodel.XSSFWorkboot. at org.apache.poi.xwpf.usermodel.XWPFRelation.<clinit>(XWPFRelation.java:122)~[poi-ooxml-5.2.3.jar!/:5.2.3]检查有没有其它库依赖低版本 poi,直接排除掉
最常见:easyexcel、hutool-poi、mybatis-plus-generator 会传 poi
例如:
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version><exclusions><exclusion><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId></exclusion><exclusion><groupId>org.apache.poi</groupId><artifactId>poi</artifactId></exclusion></exclusions>
</dependency>检查 final jar 内是否打包了多个 poi版本
jar tf your-app.jar | grep poi
如果看到有 3.x 和 5.x混在一起 → 必须排除一般不推荐直接在 pagehelper 上 exclusion 整个 poi
因为 pagehelper starter 的 pom 本身不会直接依赖 poi
它是间接依赖(例如你项目里某些别的 starter 引入的)
如果你直接 exclusion,很可能只排除到一条链,另外一条链依然会带进旧 POI
正确做法
你可以加 exclusion,但一定要 全局锁 POI 版本(dependencyManagement)一起用
举例(pagehelper上排除)<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.7</version><exclusions><exclusion><groupId>org.apache.poi</groupId><artifactId>poi</artifactId></exclusion><exclusion><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId></exclusion></exclusions>
</dependency>并且 父 POM 加锁 POI:
<dependencyManagement><dependencies><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.3</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency><dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><version>5.1.1</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-compress</artifactId><version>1.21</version></dependency></dependencies>
</dependencyManagement>这样保证:
- 不管哪个依赖带旧 poi,最终都被锁到 5.2.3
mvn dependency:tree | grep poi  可以直接定位谁带poi--------------------------------------------------------------------
现在采用的解决方案:
不使用 fat jar,直接 Linux 上放 lib 目录,这是我现在用的解决方案
- 将所有依赖 jar 单独放 lib/
- 运行:
java -cp "lib/*:app.jar" com.example.Main
保证 classpath 没有重复 POI jar构建lib 方式:
idea 方式:setting -> Project Structure -> Artifacts -> + -> JAR -> Form moduler with dependencies ->选择工程,Main Class强制 rebuild
- 删除本地 target
- mvn clean package -U
- 上传 Linux 重新运行mvn clean package -X
-X
开启 Maven 调试模式(debug mode),输出非常详细的日志,可用于排查构建错误问题 3:POI 5.x 在 JDK 8 上运行时的访问权限问题,POI 5.2.3 官方要求 JDK 11+执行,但是服务器版本是如下:
java -version
openjdk version "1.8.0_312"服务器版本和POI 5.x 需要运行的版本不一致。
POI 5.2.x 在 JDK8u312 上的已知兼容性 bug,和 fat jar、依赖冲突无关。
- POI 5.2.x 需要 JDK 8 低于 8u312,比如 8u202 / 8u265 才能正常运行1)java.lang.BootstrapMethodError: java.lang.IllegalAccessError: no such constructor: org.apache.poi.xssf.usermodel.XSSFWorkbook
at org.apache.poi.xwpf.usermodel.XWPFRelation.<clinit>(XWPFRelation.java:122) ~[poi-ooxml-5.2.3.jar!/:5.2.3]jdk-8u202-linux-aarch64.tar.gz 的国内离线下载地址wget https://mirrors.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-arm64-vfp-hflt.tar.gz -O jdk-8u202-linux-aarch64.tar.gz2)行7: bohum : 未找到命令,换行符问题
sed -i 's/\r$//' start.sh
chmod +x start.sh我的jar 包路径在/mnt/ysts/ysts-search目录下
cd /mnt/ysts/ysts-search && /mnt/ysts/jdk-11.0.28/bin/java -cp "ysts-search.jar:lib/*" com.ruoyi.ystssearch.YstsSearchApplication > app.log 2>&1 &说明:
1.cd 进入项目目录 /mnt/ysts/ysts-search
2.指定 JDK 8u202 的 java 执行路径
3.-cp "ysts-search.jar:lib/*" 把 jar 和 lib/ 下所有依赖加入 classpath
4.com.cetc28.ysts.YstsSearchApplication 替换成你的 Spring Boot 启动类全路径
5.> app.log 2>&1 & 后台运行并把日志输出到 app.log改用ctrl + c不退出程序方式
编写start.sh脚本
#!/bin/bash
APP_HOME=/mnt/ysts/ysts-search
JAVA_HOME=/mnt/ysts/jdk-11.0.28
cd $APP_HOMEnohub $JAVA_HOME/bin/java -cp "ysts-search.jar:lib/*" com.ruoyi.ystssearch.YstsSearchApplication > app.log 2>&1 &问题 4:cd /mnt/ysts/ysts-search && /mnt/ysts/jdk-11.0.28/bin/java -cp "ysts-search.jar:lib/*" com.ruoyi.ystssearch.YstsSearchApplication > app.log 2>&1 & 报错,换错了Caused by : java.lang.ClassNotFoundException: org.apache.comons.collecitons.ListValuedMap- org.apache.commons.collections.ListValuedMap 是 Apache Commons Collections 4 的类
- 很可能你在 lib/ 下没有放 commons-collections4 的 jar,或者 jar 没被 classpath 引入
- 注意:老版本 commons-collections(3.x)里是 org.apache.commons.collections.map.MultiValueMap,不是 ListValuedMap
所以你的项目依赖 commons-collections4,需要 jar 在 classpath 中解决方法一:把缺失 jar 放到 lib/ 下
给执行权限:chmod +x startup.sh

nginx配置

前端请求路径 /prod-api/exam/indicators返回 404
后端完整路径是: /exam/indicators

解决方案,目前采用方案一解决问题

解决 Nginx 代理路径问题(后端期望 /exam/indicators)
后端服务期望的路径是 /exam/indicators,而当前 Nginx 配置会将 /prod-api/exam/indicators转发为 /indicators。以下是几种解决方案:
方案1:修改 proxy_pass 配置(推荐)
location /prod-api/exam/ {# 添加路径重写,保留 /exam 前缀proxy_pass http://28.19.11.15:9212/exam/;proxy_http_version 1.1;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;# 跨域配置保持不变...
}
这样访问流程:
http://28.19.11.100:9091/prod-api/exam/indicators→ http://28.19.11.15:9212/exam/indicators
方案2:使用 rewrite 重写路径
location /prod-api/exam/ {# 重写路径:去掉 /prod-api 前缀rewrite ^/prod-api(/exam/.*)$ $1 break;proxy_pass http://28.19.11.15:9212;# 其他配置保持不变...
}
# 推荐完整配置
server {listen 9091;server_name 28.19.11.100;# 前端静态页面location / {root /jundoo/app/search;index index.html index.htm;try_files $uri $uri/ /index.html;}# exam 服务location /prod-api/exam {proxy_pass http://28.19.11.15:9212;  # 移除尾部斜杠proxy_http_version 1.1;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;# 跨域配置add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Methods 'GET,POST,OPTIONS,PUT,DELETE';add_header Access-Control-Allow-Headers 'Content-Type, Authorization';if ($request_method = OPTIONS) { return 204; }}# search 服务location /prod-api/search {proxy_pass http://28.19.11.15:9211;  # 移除尾部斜杠# 其他配置同上...}# 兜底 /prod-api/location /prod-api/ {return 404;}
}方案3:调整后端服务路径
如果可能,最佳方案是让后端服务适配前端路径:
- 将后端服务改为接受 /prod-api/exam/indicators路径
- 这样无需修改 Nginx 配置
验证配置是否生效
1.重新加载 Nginx 配置:
nginx -s reload
1.测试访问:
curl -v http://28.19.11.100:9091/prod-api/exam/indicators
http://www.dtcms.com/a/596706.html

相关文章:

  • Vue3 高级性能优化
  • 含汞废水深度处理技术实践:Tulsimer® 树脂在聚氯乙烯行业的工程应用
  • 制作简单公司网站流程用帝国cms做的网站首页
  • Java 函数式编程 | 深入探讨其应用与优势
  • 福建整站优化企业车辆管理系统平台
  • 【多模态大模型面经】 Transformer 专题面经
  • 【微服务知识】SpringCloudGateway结合Sentinel实现服务的限流,熔断与降级
  • Python基础教学:Python中enumerate函数的使用方法-由Deepseek产生
  • 算法基础篇:(六)基础算法之双指针 —— 从暴力到高效的优化艺术
  • 家庭网络搭建网站做网站能赚钱吗 知乎
  • 江苏省住房与城乡建设厅网站首页广告网站建设报价
  • HarmonyOS状态管理精细化:控制渲染范围与变量拆分策略
  • win32k!ProcessKeyboardInputWorker函数和win32k!xxxProcessKeyEvent函数分析键盘扫描码和vk码
  • k均值,密度聚类,层次聚类三种聚类底层逻辑的区别
  • 基于微信小程序的茶叶茶具销售和管理系统(源码+论文+部署+安装)
  • INT303 Big Data Analysis 大数据分析 Pt.8 聚类
  • 4-ARM-PEG-Biotin(2)/Silane(2),特性与制备方法解析
  • 【成功案例】朗迪锋助力高校实验室数智化升级
  • 【开题答辩实录分享】以《证劵数据可视化分析项目设计与实现》为例进行答辩实录分享
  • 可信计算、TPM
  • SAP HANA 发展历史:内存计算如何重塑企业级数据平台
  • 存算一体架构在空间计算中的应用
  • docker swarm集群搭建,对比k8s
  • 为什么网站需要维护需要网站建设
  • 25年05月架构甄选范文“论多模型数据源”,软考高级,系统架构设计师论文
  • 重庆做网站公司哪家比较好图片设计在线
  • Ubuntu 上使用 VSCode 调试 C++ (CMake 项目) 指南
  • opencv 学习: 07 使用迭代器 (iterator) 遍历像素
  • Two Sigma 面经分享|智商检测级别的面试,逻辑与细节缺一不可
  • 【STM32项目开源】STM32单片机物联网门禁控制系统