猿问

如何使用 maven 生成 JAR

我有一个运行 CLI 应用程序的 Springboot 应用程序。


这是我的主要课程:


@SpringBootApplication

public class MyApplication {


    @Autowired

    GameClient gameClient;


    @PostConstruct

    public void postConstruct(){

       gameClient.runGame(); 

    }


    public static void main(String[] args) {

        SpringApplication.run(GameApplication.class, args);         

    }

}

当我运行mvn package生成 JAR的命令时,Spring 会执行该postConstruct()方法并启动我的 CLI 应用程序,而不是正确生成我的 JAR。


当我删除postConstruct()成功生成 JAR 时,但我需要此方法,因为它负责运行我的 CLI 应用程序。


我该如何解决?


婷婷同学_
浏览 153回答 3
3回答

回首忆惘然

问题是gameClient.runGame()似乎通过无限运行或请求用户输入来阻止您的测试。如果您有任何测试正在运行您的 Spring Boot 应用程序,您的测试(和您的构建)也会被阻塞。即使您可以传递-Dmaven.test.skip=true参数以跳过测试(如本答案中所述),但这仍然意味着该特定测试已损坏。如果您不需要它,请删除它,或者gameClient.runGame()通过执行以下操作确保在测试期间不会调用它:将您的逻辑移至实现CommandLineRunner(or ApplicationRunner) 接口的单独类:@Componentpublic class GameRunner implements CommandLineRunner {    @Autowired    GameClient gameClient;    @Override    public void run(String...args) throws Exception {        gameClient.runGame();    }}之后,用注解对组件进行@Profile注解,例如:@Component@Profile("!test") // Add thispublic class GameRunner implements CommandLineRunner {    @Autowired    GameClient gameClient;    @Override    public void run(String...args) throws Exception {        gameClient.runGame();    }}通过使用@Profile注释,您可以告诉 Spring 仅在某些配置文件处于活动状态时加载组件。通过使用感叹号!,我们告诉 Spring 仅在测试配置文件未激活时才加载组件。现在,在您的测试中,您可以添加@ActiveProfiles("test")注释。这将在运行测试时启用测试配置文件,这意味着GameRunner不会创建 bean。

白衣非少年

我通过在生成 JAR 时跳过测试来解决它:mvn package -Dmaven.test.skip=truemvn package正在调用我的测试,它在内部初始化所有 bean,并且作为初始化的一部分,Spring 调用@PostConstruct方法。
随时随地看视频慕课网APP

相关分类

Java
我要回答