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