为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 maven 生成 JAR

如何使用 maven 生成 JAR

婷婷同学_ 2021-09-15 16:41:52
我有一个运行 CLI 应用程序的 Springboot 应用程序。这是我的主要课程:@SpringBootApplicationpublic 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 应用程序。我该如何解决?
查看完整描述

3 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

问题是gameClient.runGame()似乎通过无限运行或请求用户输入来阻止您的测试。如果您有任何测试正在运行您的 Spring Boot 应用程序,您的测试(和您的构建)也会被阻塞。


即使您可以传递-Dmaven.test.skip=true参数以跳过测试(如本答案中所述),但这仍然意味着该特定测试已损坏。如果您不需要它,请删除它,或者gameClient.runGame()通过执行以下操作确保在测试期间不会调用它:


将您的逻辑移至实现CommandLineRunner(or ApplicationRunner) 接口的单独类:


@Component

public class GameRunner implements CommandLineRunner {

    @Autowired

    GameClient gameClient;


    @Override

    public void run(String...args) throws Exception {

        gameClient.runGame();

    }

}

之后,用注解对组件进行@Profile注解,例如:


@Component

@Profile("!test") // Add this

public class GameRunner implements CommandLineRunner {

    @Autowired

    GameClient gameClient;


    @Override

    public void run(String...args) throws Exception {

        gameClient.runGame();

    }

}

通过使用@Profile注释,您可以告诉 Spring 仅在某些配置文件处于活动状态时加载组件。通过使用感叹号!,我们告诉 Spring 仅在测试配置文件未激活时才加载组件。


现在,在您的测试中,您可以添加@ActiveProfiles("test")注释。这将在运行测试时启用测试配置文件,这意味着GameRunner不会创建 bean。


查看完整回答
反对 回复 2021-09-15
?
白衣非少年

TA贡献1155条经验 获得超0个赞

我通过在生成 JAR 时跳过测试来解决它:

mvn package -Dmaven.test.skip=true

mvn package正在调用我的测试,它在内部初始化所有 bean,并且作为初始化的一部分,Spring 调用@PostConstruct方法。


查看完整回答
反对 回复 2021-09-15
  • 3 回答
  • 0 关注
  • 152 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信