如何使用 maven 生成 JAR

How to generate a JAR using maven

我有一个Spring启动应用程序,它运行是一个 CLI 应用程序。

这是我的主要内容 class:

@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 应用程序。

我该如何解决?

我在生成 JAR 时通过跳过测试解决了这个问题:

mvn package -Dmaven.test.skip=true

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

问题是 gameClient.runGame() 似乎阻止了您的测试,无论是通过 运行 无限地,还是通过请求用户输入。如果您有任何测试 运行 您的 Spring 启动应用程序,您的测试(和您的构建)也会被阻止。

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

将您的逻辑移动到实现 CommandLineRunner(或 ApplicationRunner)接口的单独 class:

@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。

首先你需要更新pom文件。

<modelVersion>4.0.0</modelVersion>
    <groupId>com.example.eg</groupId>
    <artifactId>eg</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

然后 运行 这个命令 (mvn package -Dmaven.test.skip=true)