首页 文章

如何在 生产环境 环境中运行spring boot可执行jar?

提问于
浏览
83

Spring boot的首选部署方法是通过一个包含tomcat的可执行jar文件 .

它以一个简单的 java -jar myapp.jar 开头 .

现在,我想将该jar部署到我在EC2上的linux服务器上,我是否遗漏了某些东西或者我是否真的需要创建一个init脚本来正确启动应用程序作为守护进程?

如果我只是调用 java -jar ,那么当我退出时应用程序就会死掉 .

我可以在屏幕或nohup中启动它,但这不是很优雅,我的服务器重启将迫使我登录并手动启动该过程 .

那么, Spring 季靴子的任务是否已经存在?

9 回答

  • 0

    请注意,自Spring Boot 1.3.0.M1以来,您可以使用Maven和Gradle构建完全可执行的jar .

    对于Maven,只需在_2796263中包含以下内容:

    <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
    

    更多信息,请访问以下链接:

  • 3

    到目前为止,在 生产环境 中运行Spring Boot应用程序最简单可靠的方法是使用Docker . 如果需要使用多个连接服务,请使用Docker Compose,Docker Swarm或Kubernetes .

    这是一个简单的 Dockerfile 来自官方Spring Boot Docker guide来帮助你入门:

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

    我的Spring启动应用程序有两个初始化程序 . 一个用于开发,另一个用于 生产环境 . 对于开发,我使用这样的main方法:

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

    我的 生产环境 环境初始化程序扩展了 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 任务 . 当我想将它部署到 生产环境 时,我使用 assemble 任务来生成WAR并进行部署 .

    我可以像 生产环境 中的普通 spring 应用程序一样运行,而不会在开发时忽略内置tomcat提供的优势 . 希望这可以帮助 .

  • 6

    在 生产环境 环境中,您希望在计算机重启等时再次启动应用程序,创建/etc/init.d/脚本并链接到相应的运行级别以启动和停止它是正确的方法 . Spring Boot不会扩展到覆盖它,因为它是一个特定于操作系统的设置和吨其他选项,你想要它在chroot监狱中运行,是否需要在其他软件之前停止/启动等等 .

  • 2

    您可以使用名为Supervisor的应用程序 . 在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 Installation as an init.d service (System V)

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

    干杯

  • 1

    在没有服务的Windows操作系统上

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

    我通过screen -dmS NAME / path / to / script启动我想要持久运行或至少半永久运行的应用程序 . 据我所知,这是最优雅的解决方案 .

  • 2

    这很简单,你可以使用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>
    

    并且, jvmArtuments 为你添加jvm . profiles 将选择一个配置文件来启动您的应用 . executable 可以让你的应用程序运行得很好 .

    如果你将 mvnw 添加到你的项目中,或者你有一个maven环境 . 您可以为mvnw调用 ./mvnw spring-boot:run 或为maven调用 mvn spring-boot:run .

相关问题