[英]Spring Boot maven plugin - how do I build an executable jar and include a script to run it?
[英]How do I run a spring boot executable jar in a Production environment?
Spring boot 的首选部署方法是通过一个包含 tomcat 的可执行 jar 文件。
它从一个简单的java -jar myapp.jar
。
现在,我想将该 jar 部署到我在 EC2 上的 linux 服务器,我是否遗漏了什么,或者我真的需要创建一个 init 脚本来正确启动应用程序作为守护程序?
如果我只是调用java -jar
应用程序会在我注销时java -jar
。
我可以在 screen 或 nohup 中启动它,但这不是很优雅,并且在我的服务器中重新启动会迫使我手动登录并启动该过程。
那么,spring boot 中的任务是否已经存在?
请注意,从 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
更多信息请访问以下链接:
到目前为止,在生产环境中运行 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 镜像的更好方法是使用Jib ,这是一种由 Google 维护的开源 Java 工具,用于构建 Java 应用程序的 Docker 镜像。 吊臂不需要Dockerfile
,你只是调用它与Maven(官方快速入门这里)或摇篮(官方快速入门这里)。
这是将容器作为守护程序运行的示例命令行:
docker run \
-d --restart=always \
-e "SPRING_PROFILES_ACTIVE=prod" \
-p 8080:8080 \
prefix/imagename
我的 Spring Boot 应用程序有两个初始值设定项。 一个用于开发,另一个用于生产。 对于开发,我使用如下主要方法:
@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 提供的优势。 希望这可以帮助。
在生产环境中,您希望您的应用程序在机器重启等时再次启动,创建 /etc/init.d/ 脚本并链接到适当的运行级别以启动和停止它是正确的方法。 Spring Boot 不会扩展到涵盖这一点,因为它是操作系统特定的设置,并且有很多其他选项,您是否希望它在 chroot jail 中运行,是否需要在其他软件之前停止/启动等。
您可以使用名为Supervisor的应用程序。 在主管配置中,您可以定义多个服务和执行相同服务的方式。
对于 Java 和 Spring 引导应用程序,命令将是java -jar springbootapp.jar
。
可以提供选项以保持应用程序始终运行。因此,如果 EC2 重新启动,Supervisor 将重新启动您的应用程序
与将启动脚本放在 /etc/init.d/ 中相比,我发现 Supervisor 易于使用。如果出现错误,启动脚本将挂起或进入等待状态。
如果您使用的是 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
干杯
在没有服务的 Windows 操作系统上。
启动文件
@ECHO OFF
call run.bat start
停止.bat:
@ECHO OFF
call run.bat stop
运行.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
我通过 screen -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>
并且, jvmArtuments
是为您添加的 jvm。 profiles
将选择一个配置文件来启动您的应用程序。 executable
可以使您的应用程序直接运行。
如果您将mvnw
添加到您的项目中,或者您有一个 Maven 环境。 你可以只调用./mvnw spring-boot:run
for mvnw 或mvn spring-boot:run
for maven。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.