在部署应用程序时,Spring Boot的灵活打包选项提供了很多选择。您可以将Spring Boot应用程序部署到各种云平台,容器映像(例如Docker)或虚拟机/真实机上。
本节介绍一些更常见的部署方案。
1.部署到容器
如果从容器中运行应用程序,则可以使用可执行jar,但是将其爆炸并以其他方式运行通常也是一个优点。某些PaaS实施也可能选择在运行存档之前将其解压缩。例如,Cloud Foundry以这种方式运行。运行解压存档的一种方法是启动适当的启动器,如下所示:
$ jar -xf myapp.jar
$ java org.springframework.boot.loader.JarLauncher
实际上,这在启动时(取决于jar的大小)比从未爆炸的存档中运行要快一些。在运行时,您不应期望有任何差异。
解压缩jar文件后,还可以通过使用其“自然”主方法(而不是)运行应用程序,从而额外增加启动时间JarLauncher
。例如:
$ jar -xf myapp.jar
$ java -cp BOOT-INF / classes:BOOT-INF / lib / * com.example.MyApplication
使用JarLauncher over应用程序的main方法具有可预测的类路径顺序的额外好处。该jar包含一个classpath.idx 文件,供JarLauncher 构建类路径时使用。 |
|
---|---|
还可以通过为依赖项以及应用程序类和资源(通常会更频繁地更改)创建单独的图层来创建更有效的容器映像。
2.部署到云
Spring Boot的可执行jar已为大多数流行的云PaaS(平台即服务)提供程序准备就绪。这些提供程序往往要求您“自带容器”。他们管理应用程序流程(不是专门用于Java应用程序),因此他们需要一个中间层,以使您的应用程序适应云中正在运行的流程的概念。
两家受欢迎的云提供商,Heroku和Cloud Foundry,采用了“ buildpack”方法。buildpack将部署的代码包装在启动应用程序所需的任何内容中。它可能是JDK以及对java
,嵌入式Web服务器或成熟的应用程序服务器的调用。一个buildpack是可插入的,但是理想情况下,您应该能够通过尽可能少的自定义来获得它。这减少了您无法控制的功能的占用空间。它最大程度地减少了开发和生产环境之间的差异。
理想情况下,您的应用程序像Spring Boot可执行jar一样,具有打包运行所需的一切。
在本节中,我们研究如何使在“入门”部分中开发的应用程序启动并在云中运行。
2.1。云铸造
如果未指定其他构建包,Cloud Foundry将提供默认的构建包。Cloud Foundry Java buildpack对Spring应用程序(包括Spring Boot)提供了出色的支持。您可以部署独立的可执行jar应用程序以及传统的.war
打包应用程序。
一旦您构建了应用程序(例如,使用mvn clean package
)并安装了cf
命令行工具,就可以通过使用cf push
命令来部署您的应用程序,并替换已编译的路径.jar
。推送应用程序之前,请确保已使用cf
命令行客户端登录。以下行显示使用cf push
命令部署应用程序:
$ cf push acloudyspringtime -p target / demo-0.0.1-SNAPSHOT.jar
在前面的示例中,我们用acloudyspringtime 您提供的任何值代替cf 应用程序的名称。 |
|
---|---|
请参阅cf push
文档以获取更多选项。如果manifest.yml
在同一目录中存在Cloud Foundry文件,则将其考虑。
此时,cf
开始上传您的应用程序,产生类似于以下示例的输出:
正在上传acloudyspringtime …确定
正在准备启动acloudyspringtime …确定
——->下载应用程序包(8.9M)
——-> Java Buildpack版本:v3.12(离线)| https://github.com/cloudfoundry/java-buildpack.git#6f25b7e
——->从https://java-buildpack.cloudfoundry.org/openjdk/trusty/x86_64/openjdk-1.8.0_121.tar.gz下载Open Jdk JRE 1.8.0_121(在缓存中找到)
将Open Jdk JRE扩展到.java-buildpack / open_jdk_jre(1.6s)
——->从https://java-buildpack.cloudfoundry.org/memory-calculator/trusty/x86_64/memory-calculator-2.0.2_RELEASE.tar.gz下载Open JDK,如Memory Calculator 2.0.2_RELEASE。缓存)
内存设置:-Xss349K -Xmx681574K -XX:MaxMetaspaceSize = 104857K -Xms681574K -XX:MetaspaceSize = 104857K
——->从https://java-buildpack.cloudfoundry.org/container-certificate-trust-store/container-certificate-trust-store-1.0.0_RELEASE.jar(找到的下载容器证书信任库1.0.0_RELEASE在缓存中)
将证书添加到.java-buildpack / container_certificate_trust_store / truststore.jks(0.6s)
——->从https://java-buildpack.cloudfoundry.org/auto-reconfiguration/auto-reconfiguration-1.10.0_RELEASE.jar下载Spring Auto Reconfiguration 1.10.0_RELEASE(在缓存中找到)
正在检查应用程序“ acloudyspringtime”的状态…
正在运行1个实例中的0个(正在启动1个)
…
正在运行1个实例中的0个(正在启动1个)
…
正在运行1个实例中的0个(正在启动1个)
…
1个实例中有1个正在运行(1个正在运行)
应用已启动
恭喜你!该应用程序现已上线!
应用程序上线后,可以使用cf apps
命令验证已部署应用程序的状态,如以下示例所示:
$ cf个应用
在…中获取应用程序
好
名称请求状态实例内存磁盘URL
…
acloudyspringtime已启动1/1 512M 1G acloudyspringtime.cfapps.io
…
一旦Cloud Foundry确认已经部署了您的应用程序,您就应该能够在给定的URI上找到该应用程序。在前面的示例中,您可以在找到它[https://acloudyspringtime.cfapps.io/](https://acloudyspringtime.cfapps.io/)
。
2.1.1。绑定服务
默认情况下,有关正在运行的应用程序以及服务连接信息的元数据作为环境变量(例如:)显示给应用程序$VCAP_SERVICES
。该架构决定是由于Cloud Foundry的多语言(可以将任何语言和平台支持为buildpack)所决定的。过程范围的环境变量与语言无关。
环境变量并非总是使用最简单的API,因此Spring Boot会自动提取它们并将数据展平为可以通过Spring的Environment
抽象访问的属性,如以下示例所示:
@Component
class MyBean implements EnvironmentAware {
private String instanceId;
@Override
public void setEnvironment(Environment environment) {
this.instanceId = environment.getProperty("vcap.application.instance_id");
}
// ...
}
所有Cloud Foundry属性均以开头vcap
。您可以使用vcap
属性来访问应用程序信息(例如,应用程序的公共URL)和服务信息(例如,数据库凭据)。有关完整的详细信息,请参见“ CloudFoundryVcapEnvironmentPostProcessor” Javadoc。
在Java的CFEnv项目是一个更适合的任务,如配置数据源。 | |
---|---|
2.2。Kubernetes
Spring Boot通过检查环境中的"*_SERVICE_HOST"
和"*_SERVICE_PORT"
变量来自动检测Kubernetes部署环境。您可以使用spring.main.cloud-platform
配置属性覆盖此检测。
Spring Boot帮助您管理应用程序的状态,并使用Actuator通过HTTP Kubernetes探针将其导出。
2.2.1。Kubernetes容器生命周期
当Kubernetes删除应用程序实例时,关机过程会同时涉及多个子系统:关机钩子,注销服务,将实例从负载均衡器中删除…因为此关机过程并行发生(并且由于分布式系统的性质),有一个窗口,在此期间可以将流量路由到也已开始其关闭处理的Pod。
您可以在preStop处理程序中配置睡眠执行,以避免将请求路由到已经开始关闭的Pod。此睡眠应足够长,以使新请求停止路由到Pod,并且其持续时间因部署而异。可以通过pod配置文件中的PodSpec来配置preStop处理程序,如下所示:
spec:
containers:
- name: example-container
image: example-image
lifecycle:
preStop:
exec:
command: ["sh", "-c", "sleep 10"]
一旦停止前挂钩完成,SIGTERM将被发送到容器,并且将正常关闭,从而允许完成所有剩余的运行中请求。
2.3。Heroku
Heroku是另一个流行的PaaS平台。要自定义Heroku构建,请提供Procfile
,以提供部署应用程序所需的内容。Heroku分配一个port
供Java应用程序使用,然后确保可以路由到外部URI。
您必须配置您的应用程序以侦听正确的端口。以下示例显示了Procfile
我们的入门REST应用程序的:
网路:java -Dserver.port = $ PORT -jar target / demo-0.0.1-SNAPSHOT.jar
Spring Boot使-D
参数作为可从SpringEnvironment
实例访问的属性而可用。所述server.port
配置属性被馈送到嵌入的Tomcat,码头,或暗流实例,它然后使用端口在启动时。该$PORT
环境变量由Heroku的PaaS的分配给我们。
这应该是您需要的一切。Heroku部署最常见的部署工作流程是git push
将代码投入生产,如以下示例所示:
$ git push heroku master
初始化存储库,完成。
计数对象:95,完成。
增量压缩最多使用8个线程。
压缩对象:100%(78/78),完成。
书写对象:100%(95/95),8.66 MiB | 606.00 KiB / s,已完成。
总计95(增量31),已重用0(增量0)
——->检测到Java应用
——->安装OpenJDK 1.8 …已完成
——->安装Maven 3.3.1 …已完成
——->安装settings.xml …已完成
——->执行中:mvn -B -DskipTests = true全新安装
[INFO]正在扫描项目...<br /> 下载:https://repo.spring.io / ...<br /> 下载地址:https://repo.spring.io / ...(818 B,速度为1.8 KB /秒)<br /> ....<br /> 下载地址:https://s3pository.heroku.com/jvm / ...(152 KB,595.3 KB / sec)<br /> [INFO]正在安装/ tmp / build_0c35a5d2-a067-4abc-a232-14b1fb7a8229 / target / ...<br /> [INFO]正在安装/tmp/build_0c35a5d2-a067-4abc-a232-14b1fb7a8229/pom.xml ...<br /> [INFO] ----------------------------------------------- -------------------------<br /> [INFO]建立**成功**<br /> [INFO] ----------------------------------------------- -------------------------<br /> [INFO]总时间:59.358秒<br /> [INFO]完成于:UTC 2014年3月7日星期五7:28:25<br /> [INFO]最终内存:20M / 493M<br /> [INFO] ----------------------------------------------- -------------------------
——->发现过程类型
Procfile声明类型-> Web
——->压缩…完成,70.4MB
——->启动…完成,第6版
https://agile-sierra-1405.herokuapp.com/部署到Heroku
到git@heroku.com :agile-sierra-1405.git
* [新分支]主->主
您的应用程序现在应该已经在Heroku上启动并运行了。有关更多详细信息,请参阅将Spring Boot应用程序部署到Heroku。
2.4。OpenShift
OpenShift提供了许多资源来描述如何部署Spring Boot应用程序,包括:
- 使用S2I构建器
- 建筑指南
- 在Wildfly上作为传统的Web应用程序运行
-
2.5。亚马逊网络服务(AWS)
Amazon Web Services提供了多种安装基于Spring Boot的应用程序的方法,这些方法既可以作为传统的Web应用程序(war),也可以作为具有嵌入式Web服务器的可执行jar文件安装。选项包括:
AWS Elastic Beanstalk
- AWS Code Deploy
- AWS OPS作品
- AWS云形成
- AWS容器注册表
每个都有不同的功能和定价模型。在本文档中,我们描述了使用AWS Elastic Beanstalk的方法。
2.5.1。AWS Elastic Beanstalk
如官方的Elastic Beanstalk Java指南中所述,部署Java应用程序有两个主要选项。您可以使用“ Tomcat平台”或“ Java SE平台”。
使用Tomcat平台
该选项适用于产生war文件的Spring Boot项目。无需特殊配置。您只需要遵循官方指南即可。
使用Java SE平台
此选项适用于产生jar文件并运行嵌入式Web容器的Spring Boot项目。Elastic Beanstalk环境在端口80上运行nginx实例以代理在端口5000上运行的实际应用程序。要对其进行配置,请在application.properties
文件中添加以下行:
server.port = 5000
| | 上传二进制文件而不是源文件
默认情况下,Elastic Beanstalk上载源并在AWS中进行编译。但是,最好改为上传二进制文件。这样做,向您的.elasticbeanstalk/config.yml
文件添加类似于以下内容的行:```
deploy:
artifact: target/demo-0.0.1-SNAPSHOT.jar
|
| :---: | --- |
| | 通过设置环境类型来降低成本<br />默认情况下,Elastic Beanstalk环境是负载平衡的。负载均衡器的成本很高。为避免该费用,请[按照Amazon文档](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environments-create-wizard.html#environments-create-wizard-capacity)中[的说明](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environments-create-wizard.html#environments-create-wizard-capacity)将环境类型设置为“单个实例” 。您还可以使用CLI和以下命令来创建单实例环境:eb创建-s |
| :---: | --- |
<a name="summary"></a>
#### 2.5.2。概要
这是通向AWS的最简单方法之一,但还有更多内容要讲,例如如何将Elastic Beanstalk集成到任何CI / CD工具中,如何使用Elastic Beanstalk Maven插件而不是CLI等等。有一篇[博客文章](https://exampledriven.wordpress.com/2017/01/09/spring-boot-aws-elastic-beanstalk-example/)详细介绍了这些主题。
<a name="cloud-deployment-boxfuse"></a>
### 2.6。Boxfuse和Amazon Web Services
[Boxfuse的](https://boxfuse.com/)工作原理是将您的Spring Boot可执行jar或war变成一个最小的VM映像,该映像可以在VirtualBox或AWS上不变地部署。Boxfuse与Spring Boot进行了深度集成,并使用Spring Boot配置文件中的信息自动配置端口和运行状况检查URL。Boxfuse在生成的图像以及它提供的所有资源(实例,安全组,弹性负载均衡器等)中均利用此信息。<br />创建[Boxfuse帐户](https://console.boxfuse.com/),将其连接到您的AWS帐户,安装最新版本的Boxfuse Client并确保该应用程序已由Maven或Gradle构建(通过使用`mvn clean package`)后,您就可以部署Spring使用与以下类似的命令将应用程序引导到AWS:<br />$ boxfuse运行myapp-1.0.jar -env = prod<br />请参阅[`boxfuse run`文档](https://boxfuse.com/docs/commandline/run.html)以获取更多选项。如果[`boxfuse.conf`](https://boxfuse.com/docs/commandline/#configuration)当前目录中存在文件,则将其考虑。
| | 默认情况下,Boxfuse会`boxfuse`在启动时激活一个名为Spring的配置文件。如果您的可执行jar或war包含[`application-boxfuse.properties`](https://boxfuse.com/docs/payloads/springboot.html#configuration)文件,Boxfuse的配置将基于其包含的属性。 |
| :---: | --- |
此时,`boxfuse`为您的应用程序创建一个映像,上传该映像,并在AWS上配置并启动必要的资源,其输出类似于以下示例:<br />为myapp-1.0.jar融合图像...<br />图片融合于00:06.838s(53937 K)-> axelfontaine / myapp:1.0<br />创建axelfontaine / myapp ...<br />推送axelfontaine / myapp:1.0 ...<br />验证axelfontaine / myapp:1.0 ...<br />创建弹性IP ...<br />将myapp-axelfontaine.boxfuse.io映射到52.28.233.167 ...<br />等待AWS在eu-central-1中为axelfontaine / myapp:1.0创建AMI(这可能需要长达50秒的时间)...<br />在00:23.557s-> ami-d23f38cf中创建了AMI<br />创建安全组boxfuse-sg_axelfontaine / myapp:1.0 ...<br />在eu-central-1中启动axelfontaine / myapp:1.0(ami-d23f38cf)的t2.micro实例...<br />在00:30.306s-> i-92ef9f53启动实例<br />等待AWS引导实例i-92ef9f53和有效负载从[https://52.28.235.61/](https://52.28.235.61/)开始...<br />有效负载始于00:29.266s-> [https://52.28.235.61/](https://52.28.235.61/)<br />将Elastic IP 52.28.233.167重新映射到i-92ef9f53 ...<br />等待15秒以使AWS完成弹性IP零停机时间转换...<br />部署成功完成。axelfontaine / myapp:1.0已启动并在[https://myapp-axelfontaine.boxfuse.io/](https://myapp-axelfontaine.boxfuse.io/)运行<br />您的应用程序现在应该已启动并在AWS上运行。<br />请参阅有关[在EC2](https://boxfuse.com/blog/spring-boot-ec2.html)上[部署Spring Boot应用程序](https://boxfuse.com/blog/spring-boot-ec2.html)的博客文章以及[Boxfuse Spring Boot集成](https://boxfuse.com/docs/payloads/springboot.html)的[文档,](https://boxfuse.com/docs/payloads/springboot.html)以开始使用Maven构建来运行该应用程序。
<a name="cloud-deployment-gae"></a>
### 2.7。谷歌云
Google Cloud有多个选项可用于启动Spring Boot应用程序。最容易上手的可能是App Engine,但您也可以找到在Container Engine的容器中或Compute Engine的虚拟机上运行Spring Boot的方法。<br />要在App Engine中运行,您可以先在用户界面中创建一个项目,该项目将为您设置一个唯一的标识符,并还设置HTTP路由。将Java应用程序添加到项目中,然后将其保留为空,然后使用[Google Cloud SDK](https://cloud.google.com/sdk/install)从命令行或CI构建将Spring Boot应用程序推送到该插槽中。<br />App Engine Standard要求您使用WAR包装。请按照[以下步骤](https://github.com/GoogleCloudPlatform/java-docs-samples/tree/master/appengine-java8/springboot-helloworld/README.md)将App Engine标准应用程序部署到Google Cloud。<br />另外,App Engine Flex要求您创建一个`app.yaml`文件来描述您的应用程序所需的资源。通常,您将此文件放在中`src/main/appengine`,它应类似于以下文件:
service: default runtime: java env: flex runtime_config: jdk: openjdk8 handlers:
- url: /.*
script: this field is required, but ignored
manual_scaling:
instances: 1
health_check:
enable_health_check: False
env_variables:
ENCRYPT_KEY: your_encryption_key_here
您可以通过将项目ID添加到构建配置中来部署应用程序(例如,使用Maven插件),如以下示例所示:
com.google.cloud.tools appengine-maven-plugin 1.3.0 <project>myproject</project>
`` 然后进行部署
mvn appengine:deploy`(如果您需要先进行身份验证,则构建将失败)。3.安装Spring Boot应用程序
除了使用来运行Spring Boot应用程序外java -jar
,还可以为Unix系统制作完全可执行的应用程序。完全可执行的jar可以像其他任何可执行二进制文件一样执行,也可以向init.d
或注册systemd
。这在常见的生产环境中安装和管理Spring Boot应用程序时会有所帮助。
完全可执行的jar通过在文件的开头嵌入一个额外的脚本来工作。当前,某些工具不接受此格式,因此您可能无法始终使用此技术。例如,jar -xf 可能无声地无法提取出可以完全执行的jar或war。建议仅当您打算直接执行jar或war时才使其完全可执行,而不是与jarjava -jar 容器一起运行或将其部署到servlet容器中。 |
|
---|---|
不能使zip64格式的jar文件完全可执行。尝试这样做将导致直接或与执行时报告为损坏的jar文件java -jar 。包含一个或多个zip64格式嵌套jar的标准格式jar文件可以完全执行。 |
|
---|---|
要使用Maven创建一个“完全可执行”的jar,请使用以下插件配置:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
以下示例显示了等效的Gradle配置:
bootJar {
launchScript()
}
然后,您可以通过键入./my-application.jar
(my-application
工件的名称在其中)来运行应用程序。包含jar的目录用作应用程序的工作目录。
3.1。支持的操作系统
默认脚本支持大多数Linux发行版,并已在CentOS和Ubuntu上进行了测试。其他平台,例如OS X和FreeBSD,则需要使用custom embeddedLaunchScript
。
3.2。Unix / Linux服务
通过使用init.d
或,可以轻松地将Spring Boot应用程序作为Unix / Linux服务启动systemd
。
3.2.1。作为init.d服务安装(系统V)
如果您将Spring Boot的Maven或Gradle插件配置为生成完全可执行的jar,而不使用custom embeddedLaunchScript
,则您的应用程序可以用作init.d
服务。要做到这一点,符号链接罐子init.d
,支持标准start
,stop
,restart
,和status
命令。
该脚本支持以下功能:
- 以拥有jar文件的用户身份启动服务
- 通过使用跟踪应用程序的PID
/var/run/<appname>/<appname>.pid
- 将控制台日志写入
/var/log/<appname>.log
假设您在/var/myapp
中安装了Spring Boot应用程序,以将Spring Boot应用程序作为init.d
服务安装,请创建一个符号链接,如下所示:
$ sudo ln -s /var/myapp/myapp.jar /etc/init.d/myapp
安装后,您可以按照通常的方式启动和停止服务。例如,在基于Debian的系统上,可以使用以下命令启动它:
$服务myapp启动
如果您的应用程序无法启动,请检查写入的日志文件中/var/log/<appname>.log 是否有错误。 |
|
---|---|
您还可以使用标准操作系统工具将应用程序标记为自动启动。例如,在Debian上,您可以使用以下命令:
$ update-rc.d myapp默认为
保护init.d服务
以下是一组有关如何保护作为init.d服务运行的Spring Boot应用程序的准则。它并不旨在详尽列出应加强应用程序及其运行环境的所有事情。 | |
---|---|
当以root身份执行时(例如使用root来启动init.d服务时),默认的可执行脚本以RUN_AS_USER
环境变量中指定的用户身份运行应用程序。如果未设置环境变量,则使用拥有jar文件的用户。您永远不要以身份运行Spring Boot应用程序root
,因此RUN_AS_USER
绝对不能以root身份运行,并且应用程序的jar文件也绝对不能由root拥有。而是创建一个特定用户来运行您的应用程序并设置RUN_AS_USER
环境变量,或使用chown
它来使其成为jar文件的所有者,如以下示例所示:
$ chown bootapp:bootapp your-app.jar
在这种情况下,默认的可执行脚本以bootapp
用户身份运行应用程序。
为了减少应用程序的用户帐户遭到破坏的机会,您应该考虑阻止它使用登录外壳程序。例如,您可以将帐户的外壳设置为/usr/sbin/nologin 。 |
|
---|---|
您还应该采取步骤来防止修改应用程序的jar文件。首先,配置其权限,使其不能被写入,只能由其所有者读取或执行,如以下示例所示:
$ chmod 500 your-app.jar
其次,如果您的应用程序或运行该应用程序的帐户受到威胁,您还应采取措施限制损害。如果攻击者确实获得了访问权限,则他们可以使jar文件可写并更改其内容。防止这种情况发生的一种方法是使用使其不可变chattr
,如以下示例所示:
$ sudo chattr + i your-app.jar
这将阻止任何用户(包括root用户)修改jar。
如果使用root来控制应用程序的服务,并且您使用.conf
文件自定义其启动,.conf
则root用户将读取并评估该文件。应该相应地对其进行保护。使用,chmod
以便文件只能由所有者读取,并用于chown
使root用户成为所有者,如以下示例所示:
$ chmod 400 your-app.conf
$ sudo chown root:root your-app.conf
3.2.2。作为系统服务安装
systemd
是System V init系统的后继产品,现在被许多现代Linux发行版使用。尽管您可以继续使用init.d
带有脚本systemd
,但也可以通过使用systemd
“服务”脚本来启动Spring Boot应用程序。
假设您在/var/myapp
中安装了Spring Boot应用程序,以将Spring Boot应用程序作为systemd
服务安装,请创建一个名为的脚本myapp.service
并将其放置在/etc/systemd/system
目录中。以下脚本提供了一个示例:
[单元]
说明= myapp
之后= syslog.target
[服务]
用户= myapp
ExecStart = / var / myapp / myapp.jar
SuccessExitStatus = 143
[安装]
WantedBy =多用户目标
请记住,改变Description ,User 和ExecStart 域为您的应用。 |
|
---|---|
该ExecStart 字段未声明脚本操作命令,这意味着run 默认情况下使用该命令。 |
|
---|---|
请注意,与作为init.d
服务运行时不同,运行应用程序的用户,PID文件和控制台日志文件由其systemd
自身管理,因此必须使用“服务”脚本中的适当字段进行配置。有关更多详细信息,请查阅服务单元配置手册页。
要将应用程序标记为在系统启动时自动启动,请使用以下命令:
$ systemctl启用myapp.service
请参阅以man systemctl
获取更多详细信息。
3.2.3。自定义启动脚本
由Maven或Gradle插件编写的默认嵌入式启动脚本可以通过多种方式进行自定义。对于大多数人来说,使用默认脚本和一些自定义设置通常就足够了。如果发现无法自定义所需的内容,请使用该embeddedLaunchScript
选项完全写入自己的文件。
编写后自定义启动脚本
在将启动脚本写入jar文件时,自定义启动脚本的元素通常很有意义。例如,init.d脚本可以提供“描述”。由于您已经预先了解了描述(并且无需更改),因此在生成jar时也可以提供它。
要自定义书面元素,请使用embeddedLaunchScriptProperties
Spring Boot Maven插件的选项或properties
Spring Boot Gradle插件的属性launchScript
。
默认脚本支持以下属性替换:
名称 | 描述 | Gradle默认 | Maven默认 |
---|---|---|---|
mode |
脚本模式。 | auto |
auto |
initInfoProvides |
在Provides 的“INIT INFO”节 |
${task.baseName} |
${project.artifactId} |
initInfoRequiredStart |
Required-Start “初始信息”部分。 |
$remote_fs $syslog $network |
$remote_fs $syslog $network |
initInfoRequiredStop |
Required-Stop “初始信息”部分。 |
$remote_fs $syslog $network |
$remote_fs $syslog $network |
initInfoDefaultStart |
Default-Start “初始信息”部分。 |
2 3 4 5 |
2 3 4 5 |
initInfoDefaultStop |
Default-Stop “初始信息”部分。 |
0 1 6 |
0 1 6 |
initInfoShortDescription |
Short-Description “初始信息”部分。 |
的单行版本${project.description} (回退到${task.baseName} ) |
${project.name} |
initInfoDescription |
Description “初始信息”部分。 |
${project.description} (回落到${task.baseName} ) |
${project.description} (回落到${project.name} ) |
initInfoChkconfig |
chkconfig “ INIT INFO”部分 |
2345 99 01 |
2345 99 01 |
confFolder |
的默认值 CONF_FOLDER |
包含罐子的文件夹 | 包含罐子的文件夹 |
inlinedConfScript |
引用应在默认启动脚本中内联的文件脚本。这可用于设置环境变量,例如JAVA_OPTS 在加载任何外部配置文件之前 |
||
logFolder |
的默认值LOG_FOLDER 。仅对init.d 服务有效 |
||
logFilename |
的默认值LOG_FILENAME 。仅对init.d 服务有效 |
||
pidFolder |
的默认值PID_FOLDER 。仅对init.d 服务有效 |
||
pidFilename |
PID文件名的默认值PID_FOLDER 。仅对init.d 服务有效 |
||
useStartStopDaemon |
该start-stop-daemon 命令在可用时是否应用于控制过程 |
true |
true |
stopWaitTime |
缺省值(STOP_WAIT_TIME 以秒为单位)。仅对init.d 服务有效 |
60 | 60 |
运行时自定义脚本
对于编写jar之后需要自定义脚本的项目,可以使用环境变量或配置文件。
默认脚本支持以下环境属性:
变量 | 描述 | |||
---|---|---|---|---|
MODE |
操作的“模式”。默认值取决于jar的构建方式,但通常auto 是这样(意味着,它会通过检查目录中是否是符号链接来尝试猜测它是否是初始化脚本init.d )。您可以将其显式设置为,service 以便`stop |
start | status | restart命令 run`可以运行,也可以将其设置为要在前台运行脚本。 |
RUN_AS_USER |
将用于运行应用程序的用户。未设置时,将使用拥有jar文件的用户。 | |||
USE_START_STOP_DAEMON |
该start-stop-daemon 命令在可用时是否应用于控制过程。默认为true 。 |
|||
PID_FOLDER |
pid文件夹的根名称(/var/run 默认情况下)。 |
|||
LOG_FOLDER |
放置日志文件的文件夹的名称(/var/log 默认情况下)。 |
|||
CONF_FOLDER |
从中读取.conf文件的文件夹的名称(默认情况下与jar文件相同的文件夹)。 | |||
LOG_FILENAME |
日志文件的名称LOG_FOLDER (<appname>.log 默认情况下为)。 |
|||
APP_NAME |
应用程序的名称。如果jar是从符号链接运行的,则脚本会猜测应用程序名称。如果它不是符号链接,或者您要显式设置应用程序名称,则这将很有用。 | |||
RUN_ARGS |
传递给程序的参数(Spring Boot应用程序)。 | |||
JAVA_HOME |
java 可执行文件的位置是PATH 默认情况下使用来发现的,但是如果在上有可执行文件,则可以显式设置它$JAVA_HOME/bin/java 。 |
|||
JAVA_OPTS |
启动JVM时传递给JVM的选项。 | |||
JARFILE |
jar文件的显式位置,以防脚本用于启动实际上未嵌入的jar。 | |||
DEBUG |
如果不为空,则-x 在shell进程上设置该标志,使您可以查看脚本中的逻辑。 |
|||
STOP_WAIT_TIME |
停止应用程序之前强制关闭的等待时间(以秒为单位60 )(默认情况下)。 |
的PID_FOLDER ,LOG_FOLDER 和LOG_FILENAME 变量仅适用于一个init.d 服务。对于systemd ,等效的自定义是通过使用“服务”脚本进行的。有关更多详细信息,请参见服务单元配置手册页。 |
|
---|---|
除JARFILE
和之外APP_NAME
,可以使用.conf
文件配置上一节中列出的设置。该文件应位于jar文件的旁边,并且具有相同的名称,但后缀为.conf
而不是.jar
。例如,名为jar的jar/var/myapp/myapp.jar
使用名为的配置文件/var/myapp/myapp.conf
,如以下示例所示:
myapp.conf
JAVA_OPTS = -Xmx1024M
LOG_FOLDER = / custom / log / folder
如果您不喜欢将配置文件放在jar文件旁边,则可以设置CONF_FOLDER 环境变量以自定义配置文件的位置。 |
|
---|---|
要了解有关适当保护此文件的信息,请参阅保护init.d服务的准则。
3.3。Microsoft Windows服务
可以使用来将Spring Boot应用程序作为Windows服务启动winsw
。
(一个单独维护的示例)逐步说明了如何为Spring Boot应用程序创建Windows服务。
4.接下来阅读什么
请访问Cloud Foundry,Heroku,OpenShift和Boxfuse网站,以获取有关PaaS可以提供的各种功能的更多信息。这些只是最受欢迎的Java PaaS提供程序中的四个。由于Spring Boot非常适合基于云的部署,因此您也可以自由考虑其他提供商。
下一节将继续介绍Spring Boot CLI,或者您可以直接阅读有关构建工具插件的信息。