Как создать JAR с помощью Maven - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть приложение Springboot, которое запускает приложение CLI.

Вот мой основной класс:

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

Как я могу это решить?

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Проблема в том, что gameClient.runGame(), по-видимому, блокирует ваш тест, либо бесконечно, либо запрашивая пользовательский ввод. Если у вас есть какие-либо тесты, запускающие загрузочное приложение Spring, ваш тест (и ваша сборка) также будут блокироваться.

Даже если вы можете передать параметр -Dmaven.test.skip=true, чтобы пропустить тесты (как упоминалось в в этом ответе ), это все равно означает, что этот конкретный тест не пройден. Либо удалите его, если он вам не нужен, либо убедитесь, что gameClient.runGame() не вызывается во время теста, выполнив следующие действия:

Переместите вашу логику в отдельный класс, который реализует интерфейс CommandLineRunner (или 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"). Это активирует тестовый профиль при запуске теста, и это означает, что bean-компонент GameRunner не будет создан.

0 голосов
/ 13 сентября 2018

Сначала вам нужно обновить файл 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)

0 голосов
/ 13 сентября 2018

Я решил это, пропустив тесты при генерации JAR:

mvn package -Dmaven.test.skip=true

mvn package вызывал мои тесты, которые внутренне инициализировали все bean-компоненты и, как часть инициализации, Spring вызывает @PostConstruct методы.

...