如何通过接线在Spring Boot应用程序中运行特定的类/实用程序?

时间:2018-10-12 11:26:19

标签: spring spring-boot gradle

我有我的标准Spring Boot应用程序。在某些情况下,我想运行“作业”,这基本上是一些特定的方法,通常是通过用户在浏览器中执行某些操作来运行的,但我想从命令行运行它。

我可以使用gradlew运行任意类;

./gradlew -PmainClass=kcentral.backingservices.URLMetaExtractor execute

但是,以这种方式运行时,“自动装配”均无效。有什么更好的方法来执行任意类(具有main方法),使其也可以与任何Autowiring一起使用?

编辑:

我建议使用CommandLineRunner和一些arg,它们可以通过以下方式执行命令:

./gradlew bootRun -Pargs=--reloadTestData

但是,我的Repo的自动装配失败。我所拥有的是:

@EnableAutoConfiguration
@EnableMongoAuditing
@EnableMongoRepositories(basePackageClasses=KCItemRepo.class)
@ComponentScan(basePackages = {"kcentral"})
public class ReloadTestData implements CommandLineRunner {

  @Autowired
  AddItemService addItemService;

  @Autowired
  KCItemRepo itemRepo;

  @Autowired
  KCItemRatingRepo itemRatingRepo;


  private static final Logger log = LoggerFactory.getLogger(ReloadTestData.class);


  public void reloadData(){
    log.info("reloadData and called");

    if (itemRepo == null){
      log.error("Repo not found");
      return;
    }
    long c = itemRepo.count();
    log.warn("REMOVING ALL items "+c);
    itemRepo.deleteAll();

    log.warn("REMOVING ALL ratings");
    itemRatingRepo.deleteAll();

  }

itemRepo始终为null,即使我在“常规”春季启动应用中以相同方式进行接线也没有问题。我该怎么做才能正确接线?

1 个答案:

答案 0 :(得分:1)

您说要运行“作业”的事实表明您可能希望在应用程序中使用计划任务,而不是尝试通过命令行运行它。例如Scheduling tasks in Spring

@Scheduled(fixedRate = 5000)
public void reportCurrentTime() {
    log.info("The time is now {}", dateFormat.format(new Date()));
}

如果您想使命令行应用程序与自动装配一起使用,可以通过使Application类实现CommandLineRunner接口(例如Spring Boot Console App

@SpringBootApplication
public class SpringBootConsoleApplication 
  implements CommandLineRunner {

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

    @Override
    public void run(String... args) {
    }
}

并将spring.main.web-application-type=NONE添加到属性文件。