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

时间:2014-04-05 19:59:47

标签: java linux spring spring-boot

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

它以简单的java -jar myapp.jar开始。

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

如果我只是简单地调用java -jar,那么当我退出时应用程序就会死亡。

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

那么,Spring boot中的任务是否已经存在?

9 个答案:

答案 0 :(得分:80)

请注意,自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

以下链接提供更多信息:

答案 1 :(得分:6)

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

这是来自官方Spring Boot Docker guide的简单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

答案 2 :(得分:3)

我的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 任务。当我想将其部署到生产环境时,我使用汇编任务来生成WAR并进行部署。

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

您可以使用名为Supervisor的应用程序。 在supervisor配置中,您可以定义多个服务以及执行相同的方法。

对于Java和Spring启动应用程序,命令将是 java -jar springbootapp.jar

可以提供选项以保持应用程序始终运行。如果EC2重新启动,那么Supervisor将重启您的应用程序

与在/etc/init.d/中放置启动脚本相比,我发现Supervisor易于使用。如果出现错误,启动脚本将挂起或进入等待状态。

答案 5 :(得分:2)

如果您使用的是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

欢呼声

答案 6 :(得分:2)

在没有服务的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

答案 7 :(得分:1)

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

答案 8 :(得分: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>

而且,jvmArtuments为你添加了jvm。 profiles会选择个人资料来启动您的应用。 executable可以让你的应用程序运行得很好。

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