如何从Spring Boot应用jar包中运行非Spring Boot类型的主应用程序
问题根因
你当前执行的java -jar <jarName> <com.dummy.folder3.Mainpgm1> -u <username> -p <password>命令逻辑存在错误:Spring Boot 打包生成的可执行 Jar 包默认启动入口是com.dummy.Application,你跟在 Jar 包名后的所有内容都会被识别为Application主方法的入参,根本不会触发自定义Mainpgm1的主方法执行,因此会抛出参数不合法的错误。
可行解决方案
方案1:指定类路径启动自定义主类(适配非Spring工具场景,最便捷)
不要使用-jar参数启动,改用-cp(类路径)参数显式指定启动类,命令如下:
java -cp <jarName> com.dummy.folder3.Mainpgm1 -u <username> -p <password>
注意事项:
- 如果你打的是包含所有依赖的 Fat Jar,直接执行上述命令即可
- 如果是不含依赖的瘦 Jar,需要把所有依赖的 Jar 路径都添加到
-cp参数中,多个路径用系统分隔符(Windows 为分号;,Linux/macOS 为冒号:)分隔
方案2:改造为Spring Boot CommandLineRunner(适配需要调用Spring托管Bean的场景)
如果你的工具需要调用 Spring 上下文内的托管 Bean,直接通过普通主方法调用会出现依赖注入空指针问题,可以按如下逻辑改造:
- 给
Mainpgm1添加@Component注解,实现CommandLineRunner接口 - 在重写的
run方法内增加参数判断,存在工具执行标识参数时运行你的工具逻辑,否则走原 Spring Boot 应用的启动流程 - 执行命令改为:
java -jar <jarName> -u <username> -p <password> --run.tool=enable
方案3:打包时指定主类为Mainpgm1(适配单独打工具包的场景)
如果你需要单独打包这个一次性工具,可以修改项目构建配置(pom.xml/build.gradle)里的 Spring Boot 打包参数,将主类指定为com.dummy.folder3.Mainpgm1,打包后即可直接用java -jar <jarName> -u <username> -p <password>执行。
额外排查点
如果执行方案1后仍有报错,优先排查以下内容:
- 检查
Mainpgm1的主方法参数解析逻辑是否正确,是否能正常识别-u、-p参数 - 检查调用 Spring 应用内的类时,是否依赖了 Spring 托管的 Bean,如果是则需要改用方案2,或者在主方法内手动初始化 Spring 上下文
内容的提问来源于stack exchange,提问作者Aavik
相关产品推荐
相关产品推荐

