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

发布于:2025-08-15 ⋅ 阅读:(11) ⋅ 点赞:(0)

引言:当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 package
 java -jar target/your-app.jar

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

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


网站公告

今日签到

点亮在社区的每一天
去签到