복붙노트

[SPRING] 톰캣에 전개 된 스프링 부트 전쟁

SPRING

톰캣에 전개 된 스프링 부트 전쟁

Tomcat에 Spring Boot 응용 프로그램을 배포하려고합니다. 왜냐하면 AWS에 배포하려고하기 때문입니다. WAR 파일을 만들었지 만 Tomcat에서 실행되는 것처럼 보이지는 않습니다.

세부: 0 여기 내 애플 리케이션입니다 :

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class App {
    public static void main(String[] args) {
        SpringApplication.run(SampleController.class, args);
    }
}

@Controller
@EnableAutoConfiguration
public class SampleController {
    @RequestMapping("/help")
    @ResponseBody
    String home() {
        String input = "Hi! Please use 'tag','check' and 'close' resources.";
        return input;
    }
}

application.properties에는 다음이 있습니다.

server.port=${port:7777}

최신 정보: 또 다른 참고 자료가 있습니다. 그것이 얼마나 유용한 지 확신하지 못합니다.

해결법

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

    1.이 가이드는 Tomcat에 스프링 부트 애플리케이션을 배치하는 방법을 자세히 설명합니다. http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war-file

    이 가이드는 Tomcat에 스프링 부트 애플리케이션을 배치하는 방법을 자세히 설명합니다. http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war-file

    기본적으로 다음 클래스를 추가해야했습니다.

    public class WebInitializer extends SpringBootServletInitializer {   
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(App.class);
        }    
    }
    

    또한 POM에 다음 속성을 추가했습니다.

    <properties>        
        <start-class>mypackage.App</start-class>
    </properties>
    
  2. ==============================

    2.나는 당신이 여기 다른 패러다임에 혼란스러워한다고 생각합니다. 첫째, Java Enterprise Edition (Java EE)에 속하는 파일 및 서버 배포 파일. 이러한 개념은 다른 모델을 따르는 스프링 부팅 응용 프로그램에서 실제 위치가 없습니다.

    나는 당신이 여기 다른 패러다임에 혼란스러워한다고 생각합니다. 첫째, Java Enterprise Edition (Java EE)에 속하는 파일 및 서버 배포 파일. 이러한 개념은 다른 모델을 따르는 스프링 부팅 응용 프로그램에서 실제 위치가 없습니다.

    Spring-boot는 임베디드 컨테이너를 생성하고 표준 jar 파일에서 직접 서비스를 실행하는 역할을합니다 (더 많은 일을 할 수는 있지만). 이 모델의 의도는 마이크로 서비스 개발을 지원하는 것이라고 생각합니다. 각 서비스에는 자체 컨테이너가 있으며 완전히 자체 포함되어 있습니다. 코드를 사용하여 Java EE 애플리케이션을 생성 할 수도 있지만, 특정 유형의 애플리케이션 / 서비스의 경우 스프링 부팅이 훨씬 쉽다고 생각하면 어리석은 행동입니다.

    따라서이 정보가 주어지면 앞으로 어떤 패러다임을 따라야 할 지 결정해야합니다.

    Spring-boot는 실행 가능합니다. 명령 행에서 수행 할 수 있거나 선호하는 IDE 또는 maven 또는 gradle (tip : maven이 올바른 대답입니다)을 사용하여 App 클래스에서 main 메소드를 실행하기 만하면됩니다. 그러면 기본적으로 Tomcat 서버가 나타나며 서비스가 제공됩니다. 위에 게시 한 구성이 http : // localhost : 7777 / context / help에서 제공되어야한다고 가정하면 컨텍스트는 공유하지 않은 컨텍스트 이름으로 대체됩니다.

    당신은 전쟁을 만들고, 바람둥이를 돌리거나, 무엇인가를 배치하려는 것이 아닙니다. 그 중 아무 것도 봄 부츠에서 필요하지 않습니다. 귀하의 pom에 포장은 전쟁이 아닌 항아리이어야하며 스프링 부트 시동기 바람둥이의 범위는 제거되어야합니다. 이는 확실히 제공되지 않습니다.

    main 메소드를 실행하면 콘솔 출력은 등록한 컨텍스트를 알려줍니다. 그것을 사용하여 URL을 올바르게 얻으십시오.

    그 모든 것을 말하면서, 현재 JEE 세계에 스프링 부트가 존재해야합니다 (널리 채택 될 때까지). 이러한 이유 때문에 봄 사람들은 서블릿이나 JEE 컨테이너에 배포하기 위해 실행 가능한 jar보다는 전쟁을 만드는 방법을 문서화했습니다. 이것은 스프링 부트 기술을 전쟁 (또는 귀) 이외의 것을 사용하는 것에 대한 제한이있는 환경에서 사용할 수있게 해줍니다. 그러나 이는 이러한 환경이 매우 보편적이며 해결책의 필수 또는 바람직한 부분으로 보지 않는다는 사실에 대한 단순한 응답입니다.

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

    3.이 pom.xml에 대한 변경 사항을 확인하십시오.

    이 pom.xml에 대한 변경 사항을 확인하십시오.

    <packaging>war</packaging>
    

    의존성 섹션에서 Tomcat이 제공되었음을 나타내십시오. 그래서 포함 된 Tomcat 플러그인이 필요 없습니다.

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>       
    
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>       
    

    이것이 전체 pom.xml입니다.

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.example</groupId>
        <artifactId>demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>war</packaging>
    
        <name>demo</name>
        <description>Demo project for Spring Boot</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.4.0.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <start-class>com.example.Application</start-class>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
                <scope>provided</scope>
            </dependency>       
    
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-jasper</artifactId>
                <scope>provided</scope>
            </dependency>       
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    
    </project>
    

    그리고 Application 클래스는 다음과 같아야합니다.

    Application.java

    package com.example;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.web.support.SpringBootServletInitializer;
    
    @SpringBootApplication
    public class Application extends SpringBootServletInitializer {
    
    
        /**
         * Used when run as JAR
         */
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
        /**
         * Used when run as WAR
         */
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
            return builder.sources(Application.class);
        }
    
    }
    

    그리고 MyController.java를 테스트하기위한 컨트롤러를 추가 할 수있다.

    package com.example;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller
    public class MyController {
    
        @RequestMapping("/hi")
        public @ResponseBody String hiThere(){
            return "hello world!";
        }
    }
    

    그런 다음 tomcat 8 버전에서 프로젝트를 실행하고 다음과 같이 컨트롤러에 액세스 할 수 있습니다.

    http : // localhost : 8080 / demo / hi

    어떤 이유로 프로젝트를 Tomcat에 추가 할 수 없다면 프로젝트에서 마우스 오른쪽 버튼을 클릭 한 다음 Build Path-> configure build path-> Project Faces로 이동하십시오.

    이 3 개만 선택했는지 확인하십시오.

    동적 웹 모듈 3.1 Java 1.8 자바 스크립트 1.0

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

    4.Application.java 클래스는 SpringBootServletInitializer 클래스를 확장해야합니다. 전의:

    Application.java 클래스는 SpringBootServletInitializer 클래스를 확장해야합니다. 전의:

    public class Application extends SpringBootServletInitializer {}
    
  5. ==============================

    5.가이드 (또는 Spring Initializr 사용)를 수행 한 후 로컬 컴퓨터에서 작동하지만 원격 (Tomcat에서 실행)에서는 작동하지 않는 WAR가있었습니다.

    가이드 (또는 Spring Initializr 사용)를 수행 한 후 로컬 컴퓨터에서 작동하지만 원격 (Tomcat에서 실행)에서는 작동하지 않는 WAR가있었습니다.

    오류 메시지가 없으며 방금 "Spring 서블릿 초기화 프로그램이 발견되었습니다"라고 말했지만 전혀 아무것도하지 않았습니다.

    17-Aug-2016 16:58:13.552 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.5.4
    17-Aug-2016 16:58:13.593 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive /opt/tomcat/webapps/ROOT.war
    17-Aug-2016 16:58:16.243 INFO [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
    

    17-Aug-2016 16:58:16.301 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log 2 Spring WebApplicationInitializers detected on classpath
    17-Aug-2016 16:58:21.471 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Initializing Spring embedded WebApplicationContext
    17-Aug-2016 16:58:25.133 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log ContextListener: contextInitialized()
    17-Aug-2016 16:58:25.133 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log SessionListener: contextInitialized()
    

    다른 일은 일어나지 않았다. 스프링 부트가 실행되지 않았습니다.

    분명히 나는 ​​자바 1.8로 서버를 컴파일했고, 원격 컴퓨터에는 자바 1.7이 있었다.

    Java 1.7로 컴파일 한 후 작동을 시작했습니다.

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.7</java.version> <!-- added this line -->
        <start-class>myapp.SpringApplication</start-class>
    </properties>
    
  6. ==============================

    6.나는 동일한 문제를 가지고 있었고 나는이 안내서를 따라 해결책을 찾는다. 나는 목표에 달려있다.

    나는 동일한 문제를 가지고 있었고 나는이 안내서를 따라 해결책을 찾는다. 나는 목표에 달려있다.

    그것의 나를 위해 일한 Thanq

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

    7.build.gradle에 플러그인 추가

    build.gradle에 플러그인 추가

    apply plugin: 'war'
    

    Tomcat에 제공된 종속성 추가

    dependencies {
        // other dependencies
        providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
    }
    
  8. ==============================

    8.public class Application은 SpringBootServletInitializer {}를 확장합니다.

    public class Application은 SpringBootServletInitializer {}를 확장합니다.

    SpringBootServletInitializer를 확장한다. AWS / 바람둥이에서 작동합니다.

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

    9.Spring Boot 애플리케이션을 AWS에 배포하는 것이 목표라면 Boxfuse는 매우 쉬운 솔루션을 제공합니다.

    Spring Boot 애플리케이션을 AWS에 배포하는 것이 목표라면 Boxfuse는 매우 쉬운 솔루션을 제공합니다.

    당신이해야 할 일은 :

    boxfuse run my-spring-boot-app-1.0.jar -env=prod
    

    이것은 :

    모든 이미지는 초 단위로 생성되며 변경할 수 없습니다. VirtualBox (dev) 및 AWS (test & prod)에서 변경되지 않은 상태로 실행할 수 있습니다.

    모든 업데이트는 중단없는 파란색 / 녹색 배포로 수행되며 하나의 명령으로 자동 크기 조정을 사용하도록 설정할 수도 있습니다.

    Boxfuse는 또한 Spring Boot config가 application.properties를 기반으로 보안 그룹과 ELB 상태 검사를 자동으로 구성한다는 것을 알고 있습니다.

    시작하는 데 도움이되는 자습서는 다음과 같습니다. https://boxfuse.com/getstarted/springboot

    면책 조항 : 저는 Boxfuse의 창립자이자 CEO입니다.

  10. ==============================

    10.Spring 부트 1.5.8.RELEASE로 2018-02-03을 업데이트하십시오.

    Spring 부트 1.5.8.RELEASE로 2018-02-03을 업데이트하십시오.

    pom.xml에서, Spring Plugin이 변경 패키지에 의해 전쟁 파일로 작성되었다고 알릴 필요가있다.

    <packaging>war</packaging>
    

    또한 다음을 추가하여 패키지를 빌드하는 동안 임베디드 tomcat을 제외해야합니다.

        <!-- to deploy as a war in tomcat -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
    

    전체 실행 가능한 예는 https://www.surasint.com/spring-boot-create-war-for-tomcat/에 있습니다.

  11. from https://stackoverflow.com/questions/27904594/spring-boot-war-deployed-to-tomcat by cc-by-sa and MIT license