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

SpringBoot工程妙用:不启动容器也能享受Fat Jar的便利

引言:当Java程序员遇上Linux环境检查
"又要上服务器查环境?" —— 每个Java开发者都经历过这样的痛苦时刻。我们需要获取Linux服务器的MAC地址、CPU信息等基础数据,却要为此启动一个完整的SpringBoot应用,就像用火箭筒打蚊子。
今天我要分享一个"既要又要"的完美方案:‌利用SpringBoot的Fat Jar打包机制,却不启动Web容器‌。这就像给你的瑞士军刀装上了火箭引擎,但只用来开啤酒瓶 —— 奢侈但爽快!

传统方案的 "七宗罪"
方案一:原始人打法(javac + scp)
1. 编译:javac EnvChecker.java
2. 上传:scp EnvChecker.class user@server:/tmp
3. 运行(祈祷依赖没问题):java -cp /tmp EnvChecker
4. 痛点‌:
1. 包路径地狱:com/company/module/... 目录结构手动创建
2. 依赖管理:缺少的jar包会让你怀疑人生
3. 版本兼容:本地JDK和服务器JDK版本不一致的"惊喜"

    方案二:杀鸡用牛刀(完整SpringBoot启动)
1. 运行:java -jar your-app.jar --server.port=8081
2. 尴尬场景‌:
1. Redis连接失败:因为测试环境的配置不对
2. 端口冲突:8080已被占用,改端口后又要改Nginx配置
3. 定时任务重复执行:两个实例同时跑批处理
4. 连接池浪费:只为查个MAC地址开了20个数据库连接
5. 终极解决方案:SpringBoot的"静默模式"

核心思路
保留SpringBoot的打包优势,跳过容器启动‌。就像保留火箭的外壳,但只使用它的空调系统。
具体操作(三步走)
1. 找到启动类‌(那个带@SpringBootApplication的类)
2. 注释掉Spring启动‌:       

 public static void main(String[] args) {// SpringApplication.run(App.class, args); // 把这行变成注释System.out.println("MAC地址: " + getMacAddress());}

    3. 保留所有注解‌(重要!):        

@EnableAsync
@EnableFeignClients
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,RedisAutoConfiguration.class})

为什么这招有效?
组件                传统模式        静默模式        效果对比
Tomcat            启动               不启动            省下300MB内存
连接池            初始化            跳过                避免无用连接
定时任务          执行              不执行             防止重复触发
配置加载          全加载          不加载             秒级启动

高级技巧:排除不必要的自动配置
聪明的你可能发现,有些自动配置类即使不启动Spring也会尝试加载。这时候可以用       @SpringBootApplication的exclude参数:
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class,
RedisAutoConfiguration.class,
MongoAutoConfiguration.class
})实战案例:获取服务器信息的完整示例   

 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})public class ServerInfoPrinter {public static void main(String[] args) throws Exception {// 注释掉Spring启动// SpringApplication.run(ServerInfoPrinter.class, args);System.out.println("=== 服务器体检报告 ===");System.out.println("MAC地址: " + getMacAddress());System.out.println("CPU核心: " + Runtime.getRuntime().availableProcessors());System.out.println("内存总量: " +Runtime.getRuntime().maxMemory() / 1024 / 1024 + "MB");}private static String getMacAddress() {// 实现获取MAC的逻辑}}

打包运行:   

 mvn clean packagejava -jar target/your-app.jar

注意事项(必看!)
1. 注解不能少‌:删除注解可能导致编译失败,因为有些依赖需要这些注解
2. 排除数据源‌:除非你真的需要数据库连接
3. 日志配置‌:建议保留logback.xml,方便查看输出
4. 依赖范围‌:检查pom.xml中的依赖是否都是必要的

结语:优雅永不过时
这个方案就像给你的SpringBoot工程装上了"飞行模式" —— 保留所有功能但关闭无线信号。下次当你需要:
1. 快速验证服务器环境
2. 执行一次性脚本
3. 测试某个工具类
不妨试试这个方法,让你的Fat Jar既能当战列舰也能当小快艇!毕竟,真正的技术高手不是会造火箭,而是知道什么时候不该点火。

http://www.xdnf.cn/news/17633.html

相关文章:

  • Redis:是什么、能做什么?
  • 第十三节:后期处理:效果增强
  • MySQL优化常用的几个方法
  • 使用 Python Selenium 和 Requests 实现歌曲网站批量下载实战
  • 100、【OS】【Nuttx】【构建】cmake 配置保存
  • 文心4.5专家负载均衡机制深度解析
  • 【Virtual Globe 渲染技术笔记】4 椭球面上的曲线
  • 线上Linux服务器被植入各种病毒的详细分析、处理、加固流程
  • 机器学习之TF-IDF文本关键词提取
  • EP1S20F484C6 Altera Stratix FPGA
  • imx6ull-驱动开发篇19——linux信号量实验
  • 鸿蒙开发资源导航与学习建议
  • 如何解决Unexpected token ‘<’, “<!doctype “… is not valid JSON 报错问题
  • 微服务ETCD服务注册和发现
  • LeetCode 2787.将一个数字表示成幂的和的方案数:经典01背包
  • Airtable 入门指南:从创建项目到基础数据分析与可视化
  • 渗透测试现已成为 CISO 战略的核心
  • 开疆智能Ethernet转ModbusTCP网关连接PAC3200电能表配置案例
  • 企业高性能web服务器(4)
  • 【运维进阶】Ansible 自动化
  • AI重构Java开发:飞算JavaAI如何实现效率与质量的双重突破?
  • 计算机网络摘星题库800题笔记 第6章 应用层
  • [Robotics_py] 机器人运动模型 | `update`函数 | 微积分矩阵
  • Visual Studio中VC++目录、C/C++和链接器配置的区别与最佳实践
  • 北京JAVA基础面试30天打卡08
  • 【问题解决】从Anaconda环境迁移到miniforge并在IDEA中完成环境配置
  • K8S学习---- Kubernetes 架构:从控制平面到工作节点的协作逻辑
  • Vue接口平台十三——测试记录
  • Git 撤回已推送到远程的最近push
  • 【数据结构入门】堆