我有一个运行良好的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()
。由于过去有类似要求的经验,我相信这只是冰山一角,还会有其他问题。
是否有规范的,通用的最佳实践或清单来完成此操作?
答案 0 :(得分:0)
首先要考虑的是问题的真正原因。
您错过了提到的类的程序包,但是从您的症状来看,我怀疑您的AuditApp
在同一程序包中,或者在AppLauncher
所在的子程序包中(或在config扫描的程序包中)在导入的spring.xml中声明)。
@SpringBootApplication
是other中@SpringBootConfiguration
和@ComponentScan
中的缩写。
因此,AppLauncher
在程序包扫描中将AuditApp
视为@SpringBootConfiguration
,并实例化在此配置中创建的bean。不会调用AuditApp.main
方法,但是会实例化在配置中声明的bean。
假设您在AppLauncher
中有com.yourapp
,在AuditApp
中有com.yourapp.audit
。
如果将实用程序移动到不在软件包中的软件包,请扫描AppLauncher
,例如com.yourauditapp
。运行原始应用程序时,不会创建CommandLineRunner
bean。并且AuditApp
不会影响原始应用程序。
它会干扰的另一种方法是引入依赖关系,这可能会触发某些Spring-Boot自动配置。