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


105

Spring Boot의 선호하는 배포 방법은 내부에 tomcat이 포함 된 실행 가능한 jar 파일을 사용하는 것입니다.

간단한 java -jar myapp.jar.

이제 EC2의 Linux 서버에 해당 jar를 배포하고 싶습니다. 뭔가 누락되었거나 애플리케이션을 데몬으로 올바르게 시작하기 위해 init 스크립트를 만들어야합니까?

단순히 전화 java -jar하면 응용 프로그램이 로그 아웃 할 때 죽습니다.

화면이나 nohup에서 시작할 수는 있지만 그다지 우아하지 않으며 서버를 다시 시작하면 로그인하고 프로세스를 수동으로 시작해야합니다.

그래서, 봄 부팅에서 이미 작업에 대한 것이 있습니까?


1
nohup / screen (dirty 메서드), init / systemd / upstart (적절한 메서드)

@RC 예, 제가 언급했듯이 /etc/init.d에있는 사용자 지정 스크립트를 사용하는 / sbin / init가 작업을 수행 할 수 있지만 실제로 모든 사람이 자신의 스크립트를 작성하여 데몬 (시작, 중지, 다시 시작, 상태)? 해당 솔루션에 뭔가 빠진 것 같습니다.
Cleber Goncalves 2014

스프링 부트 (정말 "신선한"프로젝트 btw)에서 뭔가 빠졌다고 생각합니다. 담당 팀에 연락하여 진화 제안을하십시오.

글쎄, 전쟁 아카이브를 생성하면 Tomcat에서 배포판 버전을 사용할 수 있으며 사용할 수있는 init 스크립트가 있습니다. 반면에 실행 가능한 jar 접근 방식을 사용하는 경우 사용자 정의 초기화 스크립트를 만들어야합니다. 그것이 부트의 영역에 있는지 확실하지 않지만 분명히 누락되어 있습니다. 이것은 다소 이상합니다. 그들을 핑할 것입니다.
Cleber Goncalves 2014

1
기존 토론 및 아이디어는 여기를 참조 하십시오 .
Dave Syer 2014

답변:


96

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에는 파일 앞에 추가 스크립트가 포함되어 있으므로 Spring Boot 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

다음 링크에서 추가 정보 :


4
당신은 또한 할 필요가 있습니다 $ chmod +x /etc/init.d/yourapp/ 정지 / 재시작을 시작 할 수
Rohith Nandakumar

항상 서비스 사용자에게 jar 파일을 읽고 실행할 수있는 권한을 부여해야합니다. 또한 작업을 수행하려면 서버 및 Java 환경 변수에 대한 기본 Java를 구성해야합니다.
micaro

작동하지 않습니다! 나는 그것을 시도하고 다음 오류가 발생합니다. MyApp.service를 시작하지 못했습니다 : Unit MyApp.service를 찾을 수 없습니다
Martijn Hiemstra

9

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

다음은 시작하는 데 도움 Dockerfile이되는 공식 Spring Boot Docker 가이드 의 간단한 내용 입니다 .

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

내 Spring 부팅 응용 프로그램에는 두 개의 이니셜 라이저가 있습니다. 하나는 개발 용이고 다른 하나는 생산 용입니다. 개발을 위해 다음과 같은 주요 방법을 사용합니다.

@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 '플러그인을 적용 합니다. 개발 환경에서 실행할 때 부트 런 태스크를 사용 합니다. 프로덕션에 배포하고 싶을 때 어셈블 작업을 사용하여 WAR을 생성하고 배포합니다.

개발하는 동안 내장 바람둥이가 제공하는 이점을 할인하지 않고 프로덕션에서 일반적인 봄 응용 프로그램처럼 실행할 수 있습니다. 도움이 되었기를 바랍니다.


2

프로덕션 환경에서는 컴퓨터를 다시 시작할 때 앱을 다시 시작하고 /etc/init.d/ 스크립트를 만들고 적절한 실행 수준에 연결하여 시작 및 중지하는 것이 올바른 방법입니다. Spring Boot는 운영 체제 별 설정이고 수많은 다른 옵션으로 확장되지 않습니다. chroot 감옥에서 실행하고 싶습니까? 다른 소프트웨어보다 먼저 중지 / 시작해야합니까?


2

Supervisor 라는 응용 프로그램을 사용할 수 있습니다 . 감독자 구성에서 여러 서비스와 동일한 실행 방법을 정의 할 수 있습니다.

Java 및 Spring 부팅 응용 프로그램의 경우 명령은 java -jar springbootapp.jar.

애플리케이션을 항상 실행하는 옵션을 제공 할 수 있으므로 EC2가 다시 시작되면 Supervisor가 애플리케이션을 다시 시작합니다.

Supervisor는 시작 스크립트를 /etc/init.d/에 넣는 것에 비해 사용하기 쉽다는 것을 알았습니다. 시작 스크립트는 오류가 발생하면 중단되거나 대기 상태가됩니다.


2

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

건배


실제로 그것은 docs.spring.io/spring-boot/docs/current/reference/html/을bootRepackage { executable = true } 참조하십시오 .
Philippe

2

서비스가없는 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

1

화면 -dmS NAME / path / to / script를 통해 지속적으로 또는 적어도 반영구적으로 실행하려는 응용 프로그램을 시작합니다. 내가 아는 한 이것이 가장 우아한 솔루션입니다.


0

이것은 간단합니다. spring boot maven 플러그인을 사용하여 코드 배포를 완료 할 수 있습니다.

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

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

그리고 jvmArtumentsjvm이 추가됩니다. profiles앱을 시작할 프로필을 선택합니다. executable앱을 driectly 실행할 수 있습니다.

mvnw프로젝트에 추가 하거나 전문가 환경이있는 경우. ./mvnw spring-boot:runmvnw 또는 mvn spring-boot:runmaven을 호출 할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.