복붙노트

[SPRING] IDE를 사용하여 스프링 부트 메인을 실행한다.

SPRING

IDE를 사용하여 스프링 부트 메인을 실행한다.

스프링 - 부트 응용 프로그램이 필요합니다.

또한 IDE (Eclipse 또는 IntelliJ IDEA Community)에서이 응용 프로그램을 마우스 오른쪽 버튼으로 클릭하고 실행하여이 응용 프로그램을 실행할 수 있습니다.

여기에 내 pom.xml의 흥미로운 부분이 있습니다 (스프링 부트 - 스타터 - 부모 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);
    }
}

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처럼 보입니다. main을 직접 실행할 때 발생하지 않는 더 많은 마법을 실행합니다.

spring-boot-startter-tomcat 의존성에서 제공된 스코프를 제거하면이 문제는 해결되지만 전쟁이 서블릿 컨테이너 내부에서 실행될 때 문제가 발생합니다.

현재 내가 발견 한 유일한 "수정"은 mvn spring-boot를 실행하는 것입니다 : 메인을 직접 실행하는 대신 IntelliJ IDEA 내에서 실행하십시오. 이것은 적절한 해결 방법이지만, 여전히 작동하지 않는 이유와 해결할 수있는 이유를 알고 싶습니다.

해결법

  1. ==============================

    1.https://youtrack.jetbrains.com/issue/IDEA-107048과 관련이있을 수 있습니다.

    https://youtrack.jetbrains.com/issue/IDEA-107048과 관련이있을 수 있습니다.

    IntelliJ IDEA는 제공된 종속성을 CLASSPATH에 주입하지 않으며 Andy는 이것이 스프링이 임베디드 서블릿 컨테이너를 만들 수없는 이유라고 설명했습니다.

    2005 년부터 다음과 같은 기능 요청이 있습니다. https://youtrack.jetbrains.com/issue/IDEABKL-99

    주석에 언급 된 해결 방법은 필수 libs가있는 가짜 모듈을 클래스 경로로 사용하거나 -Xbootclasspath JVM 인수를 사용하거나 실행 (컴파일 된) vs 구축 (제공된)을 위해 사용자 정의 maven 프로파일을 사용하는 것입니다.

  2. ==============================

    2.https://youtrack.jetbrains.com/issue/IDEA-140041에서 크게 영향을받은 해결 방법은 테스트 클래스 경로 (포함 된 서블릿 포함)로 기본 클래스를 시작하는 것입니다.

    https://youtrack.jetbrains.com/issue/IDEA-140041에서 크게 영향을받은 해결 방법은 테스트 클래스 경로 (포함 된 서블릿 포함)로 기본 클래스를 시작하는 것입니다.

  3. ==============================

    3.프로젝트 구조 -> 종속성 탭 아래에서 spring-boot-startter-tomcat 종속성의 범위를 "컴파일"로 변경하여이 작업을 수행 할 수있었습니다. 이것은 pom.xml에는 영향을 미치지 않지만 스프링 부트 실행 구성에서이 종속성을 사용할 수 있습니다

    프로젝트 구조 -> 종속성 탭 아래에서 spring-boot-startter-tomcat 종속성의 범위를 "컴파일"로 변경하여이 작업을 수행 할 수있었습니다. 이것은 pom.xml에는 영향을 미치지 않지만 스프링 부트 실행 구성에서이 종속성을 사용할 수 있습니다

    아이디어에서이 설정을 바꿀 위치에 대한 이미지는 여기를 클릭하십시오.

  4. ==============================

    4.mvn spring-boot : run은 클래스 패스를 생성 할 때 제공되는 의존성을 포함합니다. IntelliJ IDEA는 그렇지 않습니다. 클래스 패스에 Tomcat이 없다면, Spring Boot는 당신이보고있는 예외를 일으키는 내장 된 서블릿 컨테이너를 생성 할 수 없다. 아마도 이것은 IntelliJ의 버그입니다. 의존성을 제공 할 컨테이너가 없다면 실제로 클래스 경로에 있어야합니다.

    mvn spring-boot : run은 클래스 패스를 생성 할 때 제공되는 의존성을 포함합니다. IntelliJ IDEA는 그렇지 않습니다. 클래스 패스에 Tomcat이 없다면, Spring Boot는 당신이보고있는 예외를 일으키는 내장 된 서블릿 컨테이너를 생성 할 수 없다. 아마도 이것은 IntelliJ의 버그입니다. 의존성을 제공 할 컨테이너가 없다면 실제로 클래스 경로에 있어야합니다.

    IntelliJ가 main-method를 실행하여 spring-boot-startter-tomcat 종속성을 포함 할 때 사용하는 기본 클래스 경로를 재정 의하여 문제를 해결할 수 있습니다.

  5. ==============================

    5.이 페이지를 찾고 maven 프로파일을 사용하여 프로파일을 관리합니다.

    이 페이지를 찾고 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>
    

    설정 전에 주 클래스를 설정하고, 명령을 설정하십시오.

    mvn clean compile -Pdev
    
  6. ==============================

    6.필자는 제공된 libaray (spring-boot-starter-tomcat)를 프로젝트 구성에 추가하여 Intellij IDEA 2017.2에서이 문제를 해결할 수있었습니다.

    필자는 제공된 libaray (spring-boot-starter-tomcat)를 프로젝트 구성에 추가하여 Intellij IDEA 2017.2에서이 문제를 해결할 수있었습니다.

    파일 -> 프로젝트 구조를 선택하십시오. 라이브러리를 선택하고 새 프로젝트 라이브러리를 추가하십시오 (type = From Maven ...). 대화 상자를 사용하여 spring-boot-starter-tomcat을 검색하고 올바른 버전을 선택하고 확인을 클릭하여 추가하십시오. 라이브러리가 외부 라이브러리 목록에 추가됩니다.

    단점은 스프링 부트 버전이 변경된 경우이 라이브러리를 삭제하고 새 버전을 추가해야한다는 점입니다.

  7. ==============================

    7.아래의 프로필과 지침을 사용하여 다른 환경의 내용을 변경하지 않고 IntelliJ에서 개발할 수있는 프로필을 maven에 추가 할 수 있습니다.

    아래의 프로필과 지침을 사용하여 다른 환경의 내용을 변경하지 않고 IntelliJ에서 개발할 수있는 프로필을 maven에 추가 할 수 있습니다.

    <!-- 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>
    

    IntelliJ의 오른쪽에있는 Maven Projects 버튼을 클릭하고 Profiles에서 intellij를 선택하십시오.

  8. ==============================

    8.IntelliJ 2018을 사용하여 동일한 문제가 발생했습니다. 제 해결책은 다음과 같습니다.

    IntelliJ 2018을 사용하여 동일한 문제가 발생했습니다. 제 해결책은 다음과 같습니다.

  9. ==============================

    9.이 차례를 따라라:

    이 차례를 따라라:

  10. from https://stackoverflow.com/questions/30237768/run-spring-boots-main-using-ide by cc-by-sa and MIT license