spring在启动时指定启动类
有时候我们在项目里有这样的需求,不在pom文件指定主类,而是在启动时指定主类,这个我研究了半天,发现可用实现,记录一下
有这么几个点需要关注:
1.pom打包的配置
要么指定mainClass,要不就把layout设定为ZIP,里面的原理有机会再深入了解
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> <configuration> <!--如下配置,使Spring Boot使用PropertiesLauncher,可以實現在命令行指定啟動類--> <layout>ZIP</layout> </configuration> </execution> </executions> </plugin> </plugins> </build>
2.代码中的配置
2.1 首先,原来的启动类还是要有的
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class,args); } }
2.2 其次,在其他的包再建一个自定义的启动类
@ComponentScan(value = "org.example") public class ZKMasterConfig { @Autowired private ZKMasterClient zkMasterClient; public static void main(String[] args) { Thread.currentThread().setName("ZKMasterConfig"); new SpringApplicationBuilder(ZKMasterConfig.class).web(WebApplicationType.NONE).run(args); } }
2.3 特别指定了启动类,肯定是想执行特别的代码,经我测试,在这个启动类里@PostConstruct注解是不能生效的,想要初始化方法,还需要实现ApplicationRunner接口
@Component public class ZKMasterClient implements ApplicationRunner{ private final Logger logger = LoggerFactory.getLogger(ZKMasterClient.class); @Autowired private CuratorFramework zkClient; @Override public void run(ApplicationArguments args) throws Exception{ System.out.println("**************i'm ZKMasterClient.run()***************"); } }
这里有个问题,不实现接口就无法执行方法,实现了方法但其他实现了这个接口的类run方法都会执行,怎么只执行自己想要初始化的run呢?
3.java -jar执行时的配置
mvn clean install -Dmaven.test.skip java -jar distribute-sync-1.0-SNAPSHOT.jar -Dloader.main=org.example.server.ZKMasterConfig
指定启动类实现了,但个性化初始化并没有实现
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗