복붙노트

[SPRING] 프로덕션 환경에서 스프링 부트 실행 가능 jar를 실행하려면 어떻게해야합니까?

SPRING

프로덕션 환경에서 스프링 부트 실행 가능 jar를 실행하려면 어떻게해야합니까?

스프링 부트의 기본 배포 방법은 내부에 tomcat이 포함 된 실행 가능 jar 파일을 사용하는 것입니다.

이것은 간단한 java -jar myapp.jar로 시작됩니다.

자, EC2의 Linux 서버에 그 jar 파일을 배포하고 싶습니다. 뭔가 빠졌습니까? 아니면 제대로 응용 프로그램을 데몬으로 시작하려면 init 스크립트를 만들어야합니까?

간단히 java -jar를 호출하면 로그 아웃 할 때 애플리케이션이 종료됩니다.

나는 screen이나 nohup에서 시작할 수 있지만 매우 우아하지는 않으며 내 서버를 다시 시작하면 로그인하여 수동으로 프로세스를 시작하게됩니다.

그럼, 이미 봄 부팅 작업에 뭔가가 있습니까?

해결법

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

    1.Spring Boot 1.3.0.M1부터는 Maven과 Gradle을 사용하여 완전히 실행 가능한 jar 파일을 빌드 할 수 있습니다.

    Spring Boot 1.3.0.M1부터는 Maven과 Gradle을 사용하여 완전히 실행 가능한 jar 파일을 빌드 할 수 있습니다.

    Maven의 경우 pom.xml에 다음을 포함하십시오.

    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
            <executable>true</executable>
        </configuration>
    </plugin>
    

    Gradle의 경우 build.gradle에 다음 스 니펫을 추가하십시오.

    springBoot {
        executable = true
    }
    

    완전히 실행 가능한 jar에는 파일 앞부분에 여분의 스크립트가 포함되어 있습니다. 그러면 스프링 부트 jar를 init.d에 심볼릭 링크하거나 systemd 스크립트를 사용할 수 있습니다.

    init.d 예제 :

    $ln -s /var/yourapp/yourapp.jar /etc/init.d/yourapp
    

    이렇게하면 다음과 같이 응용 프로그램을 시작, 중지 및 다시 시작할 수 있습니다.

    $/etc/init.d/yourapp start|stop|restart
    

    또는 systemd 스크립트를 사용하십시오.

    [Unit]
    Description=yourapp
    After=syslog.target
    
    [Service]
    ExecStart=/var/yourapp/yourapp.jar
    User=yourapp
    WorkingDirectory=/var/yourapp
    SuccessExitStatus=143
    
    [Install]
    WantedBy=multi-user.target
    

    다음 링크에서 자세한 정보 :

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

    2.프로덕션 환경에서 Spring Boot 애플리케이션을 실행하는 가장 쉽고 신뢰할 수있는 방법은 Docker입니다. 연결된 여러 서비스를 사용해야하는 경우 Docker Compose, Docker Swarm 또는 Kubernetes를 사용하십시오.

    프로덕션 환경에서 Spring Boot 애플리케이션을 실행하는 가장 쉽고 신뢰할 수있는 방법은 Docker입니다. 연결된 여러 서비스를 사용해야하는 경우 Docker Compose, Docker Swarm 또는 Kubernetes를 사용하십시오.

    다음은 공식 Spring Boot Docker 가이드의 간단한 Dockerfile입니다.

    FROM frolvlad/alpine-oraclejdk8:slim
    VOLUME /tmp
    ADD YOUR-APP-NAME.jar app.jar
    RUN sh -c 'touch /app.jar'
    ENV JAVA_OPTS=""
    ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
    

    다음은 컨테이너를 데몬으로 실행하는 예제 명령 줄입니다.

    docker run \
      -d --restart=always \
      -e "SPRING_PROFILES_ACTIVE=prod" \
      -p 8080:8080 \
      prefix/imagename
    
  3. ==============================

    3.프로덕션 환경에서는 시스템 재시작시에 앱을 다시 시작하고 /etc/init.d/ 스크립트를 작성한 후 적절한 런레벨에 연결하여 시작 및 중지하는 올바른 방법입니다. Spring Boot는 운영체제에 특정한 설정이고 다른 옵션의 톤이므로 chroot jail에서 실행하고 싶습니까, 다른 소프트웨어 이전에 중지 / 시작해야합니까?

    프로덕션 환경에서는 시스템 재시작시에 앱을 다시 시작하고 /etc/init.d/ 스크립트를 작성한 후 적절한 런레벨에 연결하여 시작 및 중지하는 올바른 방법입니다. Spring Boot는 운영체제에 특정한 설정이고 다른 옵션의 톤이므로 chroot jail에서 실행하고 싶습니까, 다른 소프트웨어 이전에 중지 / 시작해야합니까?

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

    4.내 스프링 부팅 응용 프로그램에는 두 개의 초기화 프로그램이 있습니다. 하나는 개발 용이고 다른 하나는 생산 용입니다. 개발을 위해 다음과 같은 main 메소드를 사용한다.

    내 스프링 부팅 응용 프로그램에는 두 개의 초기화 프로그램이 있습니다. 하나는 개발 용이고 다른 하나는 생산 용입니다. 개발을 위해 다음과 같은 main 메소드를 사용한다.

    @SpringBootApplication
    public class MyAppInitializer {
    
        public static void main(String[] args) {
            SpringApplication.run(MyAppInitializer .class, args);
        }
    
    }
    

    프로덕션 환경 용 My Initializer는 SpringBootServletInitializer를 확장하며 다음과 같습니다.

    @SpringBootApplication
    public class MyAppInitializerServlet extends SpringBootServletInitializer{
        private static final Logger log = Logger
                .getLogger(SpringBootServletInitializer.class);
        @Override
        protected SpringApplicationBuilder configure(
                SpringApplicationBuilder builder) {
            log.trace("Initializing the application");
            return builder.sources(MyAppInitializerServlet .class);
        }
    
    }
    

    나는 gradle을 사용하고 build.gradle 파일은 'WAR'플러그인을 적용합니다. 개발 환경에서 실행할 때 bootrun 작업을 사용합니다. 어디에서 프로덕션 환경에 배포하고 싶은지, 나는 WAR를 생성하고 배포하기 위해 어셈블 작업을 사용합니다.

    개발하는 동안 inbuilt 바람둥이가 제공하는 이점을 할인하지 않고도 제작 과정에서 일반적인 스프링 응용 프로그램처럼 실행할 수 있습니다. 희망이 도움이됩니다.

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

    5.수퍼바이저라는 응용 프로그램을 사용할 수 있습니다. 수퍼바이저 구성에서 여러 서비스와 동일한 방법을 정의 할 수 있습니다.

    수퍼바이저라는 응용 프로그램을 사용할 수 있습니다. 수퍼바이저 구성에서 여러 서비스와 동일한 방법을 정의 할 수 있습니다.

    Java 및 Spring 부트 응용 프로그램의 경우 명령은 다음과 같습니다. java -jar springbootapp.jar.

    옵션을 제공하여 응용 프로그램을 항상 실행 상태로 유지할 수 있습니다. EC2를 다시 시작하면 관리자가 응용 프로그램을 다시 시작합니다.

    수퍼바이저는 /etc/init.d/에 시작 스크립트를 넣는 것과 비교하여 사용하기 쉽다는 것을 알았습니다. 오류가 발생하면 시작 스크립트가 멈추거나 대기 상태가됩니다.

  6. ==============================

    6.gradle을 사용한다면 build.gradle에 이것을 추가하면됩니다.

    gradle을 사용한다면 build.gradle에 이것을 추가하면됩니다.

    springBoot {
        executable = true
    }
    

    그런 다음 ./your-app.jar을 입력하여 응용 프로그램을 실행할 수 있습니다.

    또한 앱으로 서비스를 설정하는 방법에 대한 전체 안내서를 볼 수 있습니다.

    56.1.1 init.d 서비스로 설치 (System V)

    http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html

    건배

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

    7.서비스가없는 Windows OS.

    서비스가없는 Windows OS.

    start.bat

    @ECHO OFF
    call run.bat start
    

    stop.bat :

    @ECHO OFF
    call run.bat stop
    

    run.bat

    @ECHO OFF
    IF "%1"=="start" (
        ECHO start myapp
        start "myapp" java -jar -Dspring.profiles.active=staging myapp.jar
    ) ELSE IF "%1"=="stop" (
        ECHO stop myapp
        TASKKILL /FI "WINDOWTITLE eq myapp"
    ) ELSE (
        ECHO please, use "run.bat start" or "run.bat stop"
    )
    pause
    
  8. ==============================

    8.영구적으로 또는 적어도 -DmS NAME / path / to / script 화면을 통해 반영구적으로 실행하려는 응용 프로그램을 시작합니다. 제가 알기로는 이것이 가장 우아한 해결책입니다.

    영구적으로 또는 적어도 -DmS NAME / path / to / script 화면을 통해 반영구적으로 실행하려는 응용 프로그램을 시작합니다. 제가 알기로는 이것이 가장 우아한 해결책입니다.

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

    9.이것은 간단합니다. 스프링 부트 메이븐 플러그인을 사용하여 코드 배포를 완료 할 수 있습니다.

    이것은 간단합니다. 스프링 부트 메이븐 플러그인을 사용하여 코드 배포를 완료 할 수 있습니다.

    플러그인 구성은 다음과 같습니다.

    <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <jvmArguments>-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=${debug.port}
                        </jvmArguments>
                        <profiles>
                            <profile>test</profile>
                        </profiles>
                        <executable>true</executable>
                    </configuration>
                </plugin>
    

    그리고 jvmArtuments는 jvm을 추가합니다. 프로필은 앱을 시작할 프로필을 선택합니다. 실행 파일을 실행하면 앱이 제대로 실행될 수 있습니다.

    mvn을 프로젝트에 추가하거나 maven 환경이있는 경우. 그냥 호출 할 수 있습니다 ./mvnw spring-boot : mvnw 또는 mvn을 실행합니다. spring-boot : maven을 실행합니다.

  10. from https://stackoverflow.com/questions/22886083/how-do-i-run-a-spring-boot-executable-jar-in-a-production-environment by cc-by-sa and MIT license