Как запустить приложение Spring Boot с распакованными зависимостями?

У меня есть простое приложение Spring Boot, которое запускает HTTP-сервер:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Я скомпилировал его и скопировал все его зависимости в папку classes, используя цель unpack-dependencies:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <version>3.6.1</version>
  <executions>
    <execution>
      <id>unpack-dependencies</id>
      <goals>
        <goal>unpack-dependencies</goal>
      </goals>
      <configuration>
        <excludes>
          module-info.class
        </excludes>
        <outputDirectory>${project.build.outputDirectory}</outputDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

Затем я пытаюсь запустить приложение напрямую, не создавая файл jar:

java -cp "target/classes" my.Application

Однако, когда я пытаюсь запустить приложение с помощью следующей команды, Spring Boot не может загрузить необходимые зависимости. Приложение запускается и сразу завершает работу без запуска HTTP-сервера.

Если я выполню следующую команду:

mvn spring-boot:run

Приложение запускается успешно. Я проверил логи и обнаружил, что когда я использую команду mvn spring-boot:run, Spring Boot использует зависимости из папки .m2, поэтому, вероятно, он не использует распакованные зависимости из папки classes.

Можно ли запустить приложение Spring Boot без сборки архива jar и использования распакованных зависимостей? Чего мне не хватает в том, как я указываю classpath для приложения Spring Boot с его зависимостями?

Пожалуйста, ознакомьтесь с документацией Spring Boot (новейшая версия), которая поддерживает распаковку из коробки через java -Djarmode=tools -jar app.jar extract --destination app .... или получение помощи через java -Djarmode=tools -jar app.jar help...

khmarbaise 13.06.2024 18:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Spring Boot использует spring.factories файлы конфигурации в своих «начальных» зависимостях, чтобы определить, какие конфигурации инициализировать для приложения.

Поскольку я скопировал и распаковал все зависимости в один каталог target/classes, я несколько раз перезаписал файл target/classes/META-INF/spring.factories из нескольких стартеров Spring Boot.

В результате, когда я запустил свое приложение, оно использовало неправильный файл spring.factories и, следовательно, неправильные bean-компоненты.

Чтобы избежать этой проблемы, я явно добавил необходимый файл spring.factories в каталог target/classes/META-INF. Если вы используете Maven, вы можете добавить файл spring.factories в src/main/resources, и после запуска mvn package вы найдете его в target/classes/META-INF.

Подробнее о файле spring.factories можно прочитать здесь и здесь

Другие вопросы по теме