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

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.dtcms.com/a/330121.html

相关文章:

  • CAD 的 C# 开发中,对多段线(封闭多边形)内部的点进行 “一笔连线且不交叉、不出界
  • ECC的原理、背景、工作机制和数学基础
  • 升级Gradle版本后,安卓点击事件使用了SwitchCase的情况下,报错无法使用的解决方案
  • Query通过自注意力机制更新(如Transformer解码器的自回归生成)的理解
  • Unity3D 中纯 Shader 的双色纹理的平铺计算与实现
  • 二次筛法Quadratic Sieve因子分解法----C语言实现
  • [git diff] 对比检查变更 | 提交前复审 | 版本回退
  • SQL 核心操作全解析:从基础查询到关联关系实战
  • Spring Boot项目通过Feign调用三方接口的详细教程
  • 在es中安装kibana
  • 雨量系列篇一:翻斗雨量传感器与压电雨量传感器的区别是什么
  • java法定退休年龄计算器
  • Thinkphp(GUI)漏洞利用工具,支持各版本TP漏洞检测,命令执行,Getshell
  • reactive和ref使用方法及场景
  • GitHub 热榜项目 - 日榜(2025-08-13)
  • 光伏电站运维巡检指南
  • 02 流程流转
  • H616基于官方外设开发----1
  • 每日五个pyecharts可视化图表-line:从入门到精通 (5)
  • C++ 四种类型转换
  • el-table合并相同名称的列
  • 朝花夕拾(三)---------中文分词利器jieba库的详解与实战应用(python)
  • 洛谷 小 Y 拼木棒 贪心
  • 函数对象(仿函数)适配器
  • 《量子雷达》第2章 从量子信息到量子雷达 预习2025.8.13
  • 工业视觉检测中的常见的四种打光方式
  • Java 导出word 实现表格内插入图表(柱状图、折线图、饼状图)--可编辑数据
  • java反射与泛型的简单知识和应用
  • 【KO】Android 网络相关面试题
  • 326. 3 的幂