如何阻止实用程序“ main”干扰实际的“ main” SpringBoot应用程序?

时间:2020-09-07 16:52:23

标签: java spring-boot

我有一个运行良好的SpringBoot应用程序:

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }, 
    scanBasePackageClasses = { IndexSyncController.class, IndexerService.class })
@ImportResource("classpath:/spring.xml")
public class AppLauncher {

    public static void main(String[] args) {
        SpringApplication.run(AppLauncher.class, args);
    }
    

我现在也坐在src/test/java,我有一个“实用程序”,它有自己的主要方法。这也可以正常工作,但只能在我的开发环境中启动:

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class,
        WebMvcAutoConfiguration.class })
public class AuditApp {

    public static void main(String[] args) {
        SpringApplication.run(AppLauncher.class, args);
    }
    
    @Bean
    public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
        return args -> {
            ...
        };
    }

现在我有一个新要求

我需要从AuditApp中使用src/test/java实用程序并将其在生产jar中可用。

所以我只是将其从src/test/java移到src/main/java吧?不!我这样做时遇到的第一个障碍是主应用程序试图运行commandLineRunner()。由于过去有类似要求的经验,我相信这只是冰山一角,还会有其他问题。

是否有规范的,通用的最佳实践或清单来完成此操作?

1 个答案:

答案 0 :(得分:0)

首先要考虑的是问题的真正原因。 您错过了提到的类的程序包,但是从您的症状来看,我怀疑您的AuditApp在同一程序包中,或者在AppLauncher所在的子程序包中(或在config扫描的程序包中)在导入的spring.xml中声明)。

@SpringBootApplicationother@SpringBootConfiguration@ComponentScan中的缩写。 因此,AppLauncher在程序包扫描中将AuditApp视为@SpringBootConfiguration,并实例化在此配置中创建的bean。不会调用AuditApp.main方法,但是会实例化在配置中声明的bean。

假设您在AppLauncher中有com.yourapp,在AuditApp中有com.yourapp.audit。 如果将实用程序移动到不在软件包中的软件包,请扫描AppLauncher,例如com.yourauditapp。运行原始应用程序时,不会创建CommandLineRunner bean。并且AuditApp不会影响原始应用程序。

它会干扰的另一种方法是引入依赖关系,这可能会触发某些Spring-Boot自动配置。