引言:当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既能当战列舰也能当小快艇!毕竟,真正的技术高手不是会造火箭,而是知道什么时候不该点火。