有時候我們在項目里有這樣的需求,不在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
指定啟動類實現了,但個性化初始化並沒有實現
