Запустите Spring -boot main, используя IDE
У меня есть приложение spring -boot, которое должно:
- Развертываться как война в контейнере сервлетов
- Выполняется через `mvn spring -boot: run``
Я также хотел бы запустить это приложение в своей среде IDE (Eclipse или IntelliJ IDEA Community), щелкнув правой кнопкой мыши по main
и запустив его.
Вот интересные части моего pom.xml(обратите внимание, что я не наследую от spring -boot-starter-parent pom):
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
...
<build>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Здесь my SpringBootServletInitializer
:
@Configuration
@EnableAutoConfiguration
@ComponentScan("com.company.theproject")
public class Application extends SpringBootServletInitializer
{
private static final Logger logger = LoggerFactory.getLogger(Application.class);
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
{
return application.sources(Application.class);
}
public static void main(String[] args)
{
SpringApplication.run(Application.class, args);
}
}
При запуске main внутри IDE я получаю следующую ошибку:
org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.java:183) ~[spring-boot-1.2.3.RELEASE.jar:1.2.3.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:156) ~[spring-boot-1.2.3.RELEASE.jar:1.2.3.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130) ~[spring-boot-1.2.3.RELEASE.jar:1.2.3.RELEASE]
... 12 common frames omitted
Кажется, что mvn spring-boot:run
делает еще одну магию, которая не возникает при непосредственном запуске main
.
Удаление области provided
из зависимостей spring-boot-starter-tomcat
устраняет эту проблему, но вызывает проблемы, когда война запускается внутри контейнера сервлета.
В настоящее время единственным исправлением, которое я нашел, является запуск mvn spring-boot:run
внутри IntelliJ IDEA вместо прямого запуска. Хотя это приемлемое решение, я все равно хотел бы знать, почему это не работает, и если оно может быть исправлено.
Ответы
Ответ 1
Я считаю, что это может быть связано с https://youtrack.jetbrains.com/issue/IDEA-107048
IntelliJ IDEA не вводит зависимости provided
в CLASSPATH, и, как сказал Энди, именно поэтому spring не может создать встроенный контейнер сервлета.
С 2005 года у них есть запрос функции: https://youtrack.jetbrains.com/issue/IDEABKL-99
Обходные пути, упомянутые в комментариях, включают наличие поддельного модуля с необходимыми библиотеками и использование его как путь к классам, использование аргумента JVM -Xbootclasspath или использование пользовательских профилей maven для запуска (compiled
) vs building (provided
).
Ответ 2
Обходной путь, который сильно вдохновлен https://youtrack.jetbrains.com/issue/IDEA-140041, заключается в том, чтобы запустить ваш основной класс с помощью тестового пути (который включает встроенный сервлет).
Шаги (IntelliJ 16):
-
Run
→ Edit Configurations
→ Add new configuration
→ Выберите тип Application
.
- Установите
Main class
в <your.main.class>
- Установите
Use classpath of module
в <*>_test
(тестовый модуль!)
-
Ok
и Run
it!
Ответ 3
Мне удалось выполнить эту работу, изменив область зависимости spring -boot-starter-tomcat для компиляции на вкладке Структура проекта- > Зависимости. Это не влияет на pom.xml, но позволяет этим зависимостям быть доступными для spring конфигурации загрузочного прогона
Нажмите здесь для получения изображения о том, где изменить этот параметр в идее
Ответ 4
mvn spring-boot:run
включает provided
зависимости при создании пути к классам. Похоже, IntelliJ IDEA этого не делает. Без Tomcat на пути к классам Spring Boot не может создать встроенный контейнер сервлета, который вызывает исключение, которое вы видите. Возможно, это ошибка в IntelliJ, поскольку, если нет контейнера для обеспечения зависимости, тогда это действительно должно быть в пути к классам.
Возможно, вы сможете устранить проблему, переопределив путь по умолчанию, используемый IntelliJ при запуске основного метода для включения зависимости spring-boot-starter-tomcat
.
Ответ 5
Я нахожу эту страницу и использую профиль maven для управления профилями.
<profiles>
<profile>
<id>PROD</id>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</profile>
<profile>
<id>DEV</id>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>TEST</scope>
</dependency>
</dependencies>
</profile>
</profiles>
и настройте основной класс beforeLanuce
, установите команду
mvn clean compile -Pdev
Ответ 6
Мне удалось обойти эту проблему в Intellij IDEA 2017.2, добавив предоставленный libaray (spring -boot-starter-tomcat) в конфигурацию проекта.
Выберите "Файл" → "Структура проекта". Выберите "Библиотеки" и добавьте новую библиотеку проекта (type = From Maven...). Найдите spring -boot-starter-tomcat, используя диалоговое окно, выберите нужную версию и добавьте ее, нажав OK. Библиотека добавляется в список внешних библиотек.
Недостаток заключается в том, что при изменении версии Spring Boot вам необходимо будет запомнить эту библиотеку и добавить новую версию.
Ответ 7
Используя профиль и инструкции, приведенные ниже, вы можете добавить профиль в maven, который позволяет разрабатывать IntelliJ, не изменяя настройки для других сред.
<!-- Leave original dependency as-is -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<profiles>
<!-- Enable this profile to run in IntelliJ. IntelliJ excludes provided dependencies from compile by default. -->
<profile>
<id>intellij</id>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>compile</scope>
</dependency>
</dependencies>
</profile>
</profiles>
Нажмите кнопку Maven Projects в правой части IntelliJ, а в разделе Профили выберите intellij
.