У меня есть простое приложение 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
...