programing

운영 환경에서 스프링 부트 실행 파일 jar를 실행하려면 어떻게 해야 합니까?

nicegoodjob 2023. 1. 16. 20:25
반응형

운영 환경에서 스프링 부트 실행 파일 jar를 실행하려면 어떻게 해야 합니까?

스프링 부트에서는 tomcat이 내부에 포함된 실행 가능한 jar 파일을 사용하는 것이 좋습니다.

간단한 것부터 시작합니다.java -jar myapp.jar.

이 jar를 EC2의 Linux 서버에 도입하려고 합니다.무엇이 부족합니까?아니면 애플리케이션을 데몬으로 올바르게 기동하기 위해 init 스크립트를 작성할 필요가 있습니까?

전화만 하면java -jar로그아웃 시 응용 프로그램이 종료됩니다.

화면이나 nohup으로 시작할 수 있지만 그다지 우아하지 않습니다.서버를 재기동하면 로그인하여 수동으로 프로세스를 시작할 수 밖에 없습니다.

그렇다면, 스프링 부츠에 대한 태스크는 이미 있습니까?

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

또는 a를 사용합니다.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

자세한 내용은 다음 링크를 참조하십시오.

Spring Boot 어플리케이션을 실제 가동 중에 실행하는 가장 쉽고 신뢰성 높은 방법은 Docker를 사용하는 것입니다.연결된 여러 서비스를 사용해야 하는 경우 Docker Compose, Docker Swarm 또는 Kubernetes를 사용하십시오.

여기 간단한 것이 있습니다.DockerfileSpring Boot Docker 공식 가이드를 참조하십시오.

FROM openjdk:8-jdk-alpine
RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

Docker 이미지를 빌드하기 위한 보다 나은 접근법은 Java 애플리케이션의 Docker 이미지를 빌드하기 위해 Google이 관리하는 오픈 소스 Java 도구인 Jib를 사용하는 것입니다.Jib는 필요 없습니다.DockerfileMaven(여기에서는 공식 퀵스타트) 또는 Gradle(여기에서는 공식 퀵스타트)로 호출하기만 하면 됩니다.

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

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

스프링 부트 애플리케이션에는 2개의 이니셜라이저가 있습니다.하나는 개발용이고 다른 하나는 생산용입니다.개발에는 다음과 같은 주요 방법을 사용합니다.

@SpringBootApplication
public class MyAppInitializer {

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

}

실제 가동 환경용 My Initializer는 Spring Boot Servlet을 확장이니셜라이저 및 다음과 같이 표시됩니다.

@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을 생성하고 도입합니다.

개발 중에 내장된 Tomcat이 제공하는 장점을 할인하지 않고 일반 스프링 애플리케이션처럼 프로덕션 환경에서 실행할 수 있습니다.이게 도움이 됐으면 좋겠다.

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

실제 가동 환경에서는 머신의 재기동시에 앱을 재기동하고 싶은 경우, /etc/init.d/ 스크립트를 작성하고 적절한 실행 레벨에 링크하여 기동 및 정지하는 것이 올바른 방법입니다.Spring Boot는 운영체제 고유의 셋업이며 기타 옵션도 많이 있기 때문에 이를 다루지 않습니다.chroot 감옥에서 실행할 필요가 있는지, 다른 소프트웨어보다 먼저 정지/기동할 필요가 있는지 등입니다.

슈퍼바이저라는 어플리케이션을 사용할 수 있습니다.슈퍼바이저 설정에서는 여러 서비스와 동일한 실행 방법을 정의할 수 있습니다.

및, Spring, Spring, Spring, Spring, Spring, Spring, Spring, Spring 등입니다.java -jar springbootapp.jar.

응용 프로그램을 항상 실행할 수 있도록 옵션을 제공할 수 있습니다.따라서 EC2가 재부팅되면 슈퍼바이저가 애플리케이션을 재부팅합니다.

슈퍼바이저는 /etc/init.d/에 스타트업 스크립트를 넣는 것에 비해 사용하기 쉬웠습니다.기동 스크립트는, 에러가 발생했을 경우에 행업 하거나 대기 상태가 됩니다.

gradle을 사용하는 경우 build.gradle에 추가할 수 있습니다.

springBoot {
    executable = true
}

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

또한 앱의 서비스화 설정을 위한 전체 가이드를 여기에서 찾을 수 있습니다.

56.1.1 init.d 서비스로서의 설치(시스템 V)

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

건배.

영속적으로 실행하거나 적어도 반영구적으로 실행하고 싶은 어플리케이션을 화면 -dmS NAME /path/to/script에서 실행합니다.내가 아는 바로는 이것이 가장 우아한 해결책이다.

이것은 간단한 것으로, 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앱을 부드럽게 실행할 수 있습니다.

를 and를 mvnw당신의 프로젝트에 참여하지 않으면, 당신은 미련이 있습니다. ../mvnw spring-boot:run mvnw의 mvn spring-boot:run메이븐을 위해.

언급URL : https://stackoverflow.com/questions/22886083/how-do-i-run-a-spring-boot-executable-jar-in-a-production-environment

반응형