У меня есть приложение 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 вместо прямого запуска. Хотя это приемлемое решение, я все равно хотел бы знать, почему это не работает, и если оно может быть исправлено.