Подтвердить что ты не робот

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

4b9b3361

Ответ 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):

  • RunEdit ConfigurationsAdd 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.