如何使用 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)
我有一个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)