我在同一个Spring引导中有2个CommandLineRunner

时间:2018-04-21 22:10:03

标签: spring-boot

我在spring boot中有2个类实现命令行运行器。他们基本上看起来像这样:

 @SpringBootApplication
 @ComponentScan("com.xxxx")
 public class Application implements CommandLineRunner {

,第二个看起来像:

 @SpringBootApplication
 @ComponentScan("com.xxxx")
 public class ApplicationWorklfow implements CommandLineRunner {

他们编译得很好。但是当我尝试用java -jar运行它时,我得到一个错误,大概是因为spring不知道要运行哪一个。

是否有一个我可以使用的命令会告诉jar我正在尝试运行哪个应用程序?

1 个答案:

答案 0 :(得分:2)

您可以拥有任意数量的CommandLineRunner bean,但应该只有一个可以拥有@SpringBootApplication注释的入口点类。请尝试删除@SpringBootApplication上的ApplicationWorklfow注释。

<强> PS:

似乎您的主要要求是有条件地启用2个CommandLineRunner bean中的一个。您可以只有一个Application类,并使用@Profile@ConditionalOnProperty等条件有条件地启用CLR bean。

有多个带@SpringBootApplication注释的入口点类不是一个好主意。

@SpringBootApplication
public class Application {

}

@Component
@Profile("profile1")
public class AppInitializer1 implements CommandLineRunner {

}

@Component
@Profile("profile2")
public class AppInitializer2 implements CommandLineRunner {

}

现在您可以按如下方式激活所需的个人资料:

java -jar -Dspring.profiles.active=profile1 app.jar

激活 profile1 后,只会运行 AppInitializer1

PS:PS:

如果由于某种原因你还想配置mainClass,你可以这样做:

   <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>          
      <configuration>
        <mainClass>${start-class}</mainClass>
      </configuration>

    </plugin>

您可以利用Maven配置文件为不同的配置文件提供不同的类。有关详细信息,请参阅https://docs.spring.io/spring-boot/docs/2.0.1.RELEASE/maven-plugin/usage.html