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

指定啟動類實現了,但個性化初始化並沒有實現


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM