it-swarm.com.ru

Запустите основной загрузчик Spring-boot IDE

У меня есть приложение весенней загрузки, которое должно:

  • Быть развертываемым как война в контейнере сервлета
  • Быть запущенным через `mvn spring-boot: run``

Я также хотел бы иметь возможность запускать это приложение в моем IDE (сообществе Eclipse или IntelliJ IDEA), щелкнув правой кнопкой мыши на 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>

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

30
GuiSim

Я считаю, что это может быть связано с https://youtrack.jetbrains.com/issue/IDEA-107048

IntelliJ IDEA не внедряет зависимости provided в CLASSPATH, и, как сказал Энди, именно поэтому Spring не может создать встроенный контейнер сервлета.

С 2005 года у них есть запрос на добавление новых функций: https://youtrack.jetbrains.com/issue/IDEABKL-99

Обходные пути, упомянутые в комментариях, включают в себя наличие поддельного модуля с необходимыми библиотеками и использование его в качестве classpath, использование аргумента JVM -Xbootclasspath или использование пользовательских профилей maven для запуска (compiled) vs building (provided). 

14
Marc-André Poulin

Временное решение, основанное на https://youtrack.jetbrains.com/issue/IDEA-140041 , заключается в том, чтобы начать свой основной класс с тестового пути к классам (который включает в себя встроенный сервлет).

Шаги (IntelliJ 16):

  1. Run -> Edit Configurations -> Add new configuration -> Pick Application тип.
  2. Установите Main class в <your.main.class>
  3. Установите Use classpath of module в <*>_test (тестовый модуль!)
  4. Ok и Run это!
23
yop83

Я смог сделать эту работу, изменив область действия зависимости spring-boot-starter-Tomcat на «compile» на вкладке «Структура проекта» -> «Зависимости». Это не влияет на pom.xml, но позволяет использовать эти зависимости для конфигурации весеннего запуска

Нажмите здесь для изображения, где изменить эту настройку в идее

6
nishantkyal

mvn spring-boot:run включает в себя зависимости provided при создании пути к классам. Похоже, что IntelliJ IDEA нет. Без Tomcat на пути к классам Spring Boot не может создать встроенный контейнер сервлета, который вызывает исключение, которое вы видите. Возможно, это ошибка в IntelliJ, так как если нет контейнера для предоставления зависимости, то он действительно должен быть в пути к классам.

Вы можете решить проблему, переопределив путь к классу по умолчанию, который IntelliJ использует при запуске основного метода, чтобы включить зависимость spring-boot-starter-Tomcat.

3
Andy Wilkinson

Мне удалось обойти эту проблему в Intellij IDEA 2017.2, добавив прилагаемый libaray (spring-boot-starter-Tomcat) в конфигурацию проекта.

Выберите Файл -> Структура проекта. Выберите «Библиотеки» и добавьте новую библиотеку проекта (type = From Maven ...). Найдите Spring-Boot-Starter-Tomcat, используя диалоговое окно, выберите правильную версию и добавьте ее, нажав OK. Библиотека добавлена ​​в список внешних библиотек.

Недостатком является то, что если версия Spring Boot изменена, вам нужно будет не забыть удалить эту библиотеку и добавить новую версию.

1
phn

Используя профиль и приведенные ниже инструкции, вы можете добавить профиль в 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 и в разделе Profiles выберите intellij.

1
AnthonyW

Я нахожу эту страницу и использую профиль 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
1
wang xinli

Следуй этим шагам:

  1. В верхней правой части окна intellij щелкните раскрывающийся список и выберите «Изменить конфигурацию», и откроется новое окно.

  2. В этом окне в левом верхнем углу нажмите кнопку «+» и выберите загрузку спринта.

 enter image description here

  1. Затем добавьте основной класс и другие детали, как показано на скриншоте .  enter image description here

  2. Теперь запустите приложение.

0
KayV

У меня была та же проблема с использованием IntelliJ 2018. Мое решение:

  1. Перейдите к Run -> Edit Configurations.

  2. Выберите Application && выберите текущий проект.

  3. Проверьте Include dependencies with "Provided" scope.

  4. OK -> RUN 

0
Sparow199