部署 Spring Boot 应用程序
1. 部署到云
Spring Boot 的可执行 jar 是为大多数流行的云 PaaS(平台即服务)提供商准备的。 这些提供商往往要求您“自带容器”。 它们管理应用程序进程(不是专门针对 Java 应用程序),因此它们需要一个中间层来使您的应用程序适应云中正在运行的进程的概念。
Heroku 和 Cloud Foundry 这两个流行的云提供商采用了“构建包”方法。
buildpack 将部署的代码包装在启动应用程序所需的任何内容中。
它可能是一个 JDK 和java
、嵌入式 Web 服务器或成熟的应用程序服务器。
构建包是可插拔的,但理想情况下,您应该能够通过尽可能少的自定义来完成。
这减少了不受您控制的功能的占用空间。
它最大限度地减少了开发环境和生产环境之间的差异。
理想情况下,您的应用程序(如 Spring Boot 可执行 jar)将运行所需的一切打包在其中。
在本节中,我们将了解如何在“入门”部分中开发的应用程序在云中启动并运行。
1.1. 云铸造厂
Cloud Foundry 提供默认的 buildpack,如果未指定其他 buildpack,则这些 buildpack 将发挥作用。
Cloud Foundry Java 构建包对 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
文档以获取更多选择。
如果有 Cloud Foundrymanifest.yml
文件存在于同一目录中,则被视为。
此时,cf
开始上传您的应用程序,生成类似于以下示例的输出:
Uploading acloudyspringtime... OK Preparing to start acloudyspringtime... OK -----> Downloaded app package (8.9M) -----> Java Buildpack Version: v3.12 (offline) | https://github.com/cloudfoundry/java-buildpack.git#6f25b7e -----> Downloading Open Jdk JRE 1.8.0_121 from https://java-buildpack.cloudfoundry.org/openjdk/trusty/x86_64/openjdk-1.8.0_121.tar.gz (found in cache) Expanding Open Jdk JRE to .java-buildpack/open_jdk_jre (1.6s) -----> Downloading Open JDK Like Memory Calculator 2.0.2_RELEASE from https://java-buildpack.cloudfoundry.org/memory-calculator/trusty/x86_64/memory-calculator-2.0.2_RELEASE.tar.gz (found in cache) Memory Settings: -Xss349K -Xmx681574K -XX:MaxMetaspaceSize=104857K -Xms681574K -XX:MetaspaceSize=104857K -----> Downloading Container Certificate Trust Store 1.0.0_RELEASE from https://java-buildpack.cloudfoundry.org/container-certificate-trust-store/container-certificate-trust-store-1.0.0_RELEASE.jar (found in cache) Adding certificates to .java-buildpack/container_certificate_trust_store/truststore.jks (0.6s) -----> Downloading Spring Auto Reconfiguration 1.10.0_RELEASE from https://java-buildpack.cloudfoundry.org/auto-reconfiguration/auto-reconfiguration-1.10.0_RELEASE.jar (found in cache) Checking status of app 'acloudyspringtime'... 0 of 1 instances running (1 starting) ... 0 of 1 instances running (1 starting) ... 0 of 1 instances running (1 starting) ... 1 of 1 instances running (1 running) App started
祝贺!该应用程序现已上线!
应用程序上线后,您可以使用cf apps
命令,如以下示例所示:
$ cf apps
Getting applications in ...
OK
name requested state instances memory disk urls
...
acloudyspringtime started 1/1 512M 1G acloudyspringtime.cfapps.io
...
一旦 Cloud Foundry 确认您的应用程序已部署,您应该能够在给定的 URI 中找到该应用程序。
在前面的示例中,您可以在以下位置找到它https://acloudyspringtime.cfapps.io/
.
1.1.1. 绑定到服务
默认情况下,有关正在运行的应用程序的元数据以及服务连接信息作为环境变量向应用程序公开(例如:$VCAP_SERVICES
).
这种架构决策是由于 Cloud Foundry 的多语言(任何语言和平台都可以作为构建包支持)的性质。
进程范围的环境变量与语言无关。
环境变量并不总是最简单的 API,因此 Spring Boot 会自动提取它们并将数据扁平化为可以通过 Spring 的Environment
抽象,如以下示例所示:
@Component
public class MyBean implements EnvironmentAware {
private String instanceId;
@Override
public void setEnvironment(Environment environment) {
this.instanceId = environment.getProperty("vcap.application.instance_id");
}
// ...
}
@Component
class MyBean : EnvironmentAware {
private var instanceId: String? = null
override fun setEnvironment(environment: Environment) {
instanceId = environment.getProperty("vcap.application.instance_id")
}
// ...
}
所有 Cloud Foundry 属性都以vcap
.
您可以使用vcap
属性来访问应用程序信息(例如应用程序的公共 URL)和服务信息(例如数据库凭据)。
有关完整详细信息,请参阅“CloudFoundryVcapEnvironmentPostProcessor”Javadoc。
Java CFEnv 项目更适合配置数据源等任务。 |
1.2. Kubernetes
Spring Boot 通过检查环境中的"*_SERVICE_HOST"
和"*_SERVICE_PORT"
变量。
您可以使用spring.main.cloud-platform
configuration 属性。
Spring Boot 可帮助您管理应用程序的状态,并使用 Actuator 使用 HTTP Kubernetes Probes 将其导出。
1.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 将被发送到容器并开始正常关闭,从而允许完成任何剩余的正在进行的请求。
当 Kubernetes 向 Pod 发送 SIGTERM 信号时,它会等待一个指定的时间,称为终止宽限期(默认值为 30 秒)。
如果容器在宽限期后仍在运行,则会向它们发送 SIGKILL 信号并强制删除。
如果 Pod 关闭所需的时间超过 30 秒,这可能是因为您已将spring.lifecycle.timeout-per-shutdown-phase ,请确保通过设置terminationGracePeriodSeconds 选项。 |
1.3. 赫罗库
Heroku 是另一个流行的 PaaS 平台。
要自定义 Heroku 构建,您需要提供一个Procfile
,它提供了部署应用程序所需的咒语。
Heroku 分配一个port
,然后确保路由到外部 URI 有效。
您必须将应用程序配置为侦听正确的端口。
以下示例显示了Procfile
对于我们的入门 REST 应用程序:
web: java -Dserver.port=$PORT -jar target/demo-0.0.1-SNAPSHOT.jar
Spring Boot 使-D
参数可作为可从 Spring 访问的属性Environment
实例。
这server.port
配置属性被馈送到嵌入式 Tomcat、Jetty 或 Undertow 实例,然后在启动时使用该端口。
这$PORT
环境变量是由 Heroku PaaS 分配给我们的。
这应该是您需要的一切。
Heroku 部署最常见的部署工作流程是git push
代码到生产环境,如以下示例所示:
$ git push heroku main
这将导致以下结果:
Initializing repository, done. Counting objects: 95, done. Delta compression using up to 8 threads. Compressing objects: 100% (78/78), done. Writing objects: 100% (95/95), 8.66 MiB | 606.00 KiB/s, done. Total 95 (delta 31), reused 0 (delta 0) -----> Java app detected -----> Installing OpenJDK 1.8... done -----> Installing Maven 3.3.1... done -----> Installing settings.xml... done -----> Executing: mvn -B -DskipTests=true clean install [INFO] Scanning for projects... Downloading: https://repo.spring.io/... Downloaded: https://repo.spring.io/... (818 B at 1.8 KB/sec) .... Downloaded: https://s3pository.heroku.com/jvm/... (152 KB at 595.3 KB/sec) [INFO] Installing /tmp/build_0c35a5d2-a067-4abc-a232-14b1fb7a8229/target/... [INFO] Installing /tmp/build_0c35a5d2-a067-4abc-a232-14b1fb7a8229/pom.xml ... [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 59.358s [INFO] Finished at: Fri Mar 07 07:28:25 UTC 2014 [INFO] Final Memory: 20M/493M [INFO] ------------------------------------------------------------------------ -----> Discovering process types Procfile declares types -> web -----> Compressing... done, 70.4MB -----> Launching... done, v6 https://agile-sierra-1405.herokuapp.com/ deployed to Heroku To [email protected]:agile-sierra-1405.git * [new branch] main -> main
您的应用程序现在应该在 Heroku 上启动并运行。 有关更多详细信息,请参阅将 Spring Boot 应用程序部署到 Heroku。
1.4. 开放的
OpenShift 有许多资源描述了如何部署 Spring Boot 应用程序,包括:
1.5. 亚马逊云科技 (AWS)
Amazon Web Services 提供了多种安装基于 Spring Boot 的应用程序的方法,可以作为传统的 Web 应用程序 (war) 或作为带有嵌入式 Web 服务器的可执行 jar 文件。 选项包括:
-
AWS 弹性 Beanstalk
-
AWS 代码部署
-
AWS 运营工作
-
AWS 云形成
-
AWS 容器注册表
每个都有不同的功能和定价模型。 在本文档中,我们将介绍如何使用 AWS Elastic Beanstalk。
1.5.1. AWS 弹性 Beanstalk
如官方 Elastic Beanstalk Java 指南中所述,部署 Java 应用程序有两个主要选项。 您可以使用“Tomcat 平台”或“Java SE 平台”。
使用 Java SE 平台
此选项适用于生成jar文件并运行嵌入式Web容器的Spring Boot项目。
Elastic Beanstalk 环境在端口 80 上运行一个 nginx 实例,以代理在端口 5000 上运行的实际应用程序。
要配置它,请将以下行添加到您的application.properties
文件:
server.port=5000
上传二进制文件而不是源
默认情况下,Elastic Beanstalk 会上传源代码并在 AWS 中编译它们。
但是,最好上传二进制文件。
为此,请将类似于以下的行添加到您的
|
通过设置环境类型降低成本
默认情况下,Elastic Beanstalk 环境是负载均衡的。 负载均衡器的成本很高。 为避免该成本,请将环境类型设置为“单实例”,如 Amazon 文档中所述。 您还可以使用 CLI 和以下命令创建单实例环境: eb create -s |
1.5.2. 总结
这是访问 AWS 的最简单方法之一,但还有更多内容需要涵盖,例如如何将 Elastic Beanstalk 集成到任何 CI/CD 工具中,使用 Elastic Beanstalk Maven 插件而不是 CLI 等。 有一篇博客文章更详细地介绍了这些主题。
1.6. CloudCaptain 和 Amazon Web Services
CloudCaptain 的工作原理是将 Spring Boot 可执行 jar 或 war 转换为最小的 VM 映像,该映像可以原封不动地部署在 VirtualBox 或 AWS 上。 CloudCaptain 为 Spring Boot 提供了深度集成,并使用 Spring Boot 配置文件中的信息自动配置端口和健康检查 URL。 CloudCaptain 将此信息用于它生成的映像以及它预置的所有资源(实例、安全组、弹性负载均衡器等)。
创建 CloudCaptain 账户后,将其连接到您的 AWS 账户,安装最新版本的 CloudCaptain 客户端,并确保应用程序是由 Maven 或 Gradle 构建的(例如,通过使用mvn clean package
),您可以使用类似于以下的命令将 Spring Boot 应用程序部署到 AWS:
$ boxfuse run myapp-1.0.jar -env=prod
请参阅boxfuse run
文档以获取更多选择。
如果有boxfuse.conf
文件存在于当前目录中,则将其考虑。
默认情况下,CloudCaptain 会激活名为boxfuse 启动时。
如果您的可执行 jar 或 war 包含application-boxfuse.properties 文件中,CloudCaptain 的配置基于它包含的属性。 |
此时,CloudCaptain 会为您的应用程序创建一个映像,上传它,并在 AWS 上配置和启动必要的资源,从而产生类似于以下示例的输出:
Fusing Image for myapp-1.0.jar ... Image fused in 00:06.838s (53937 K) -> axelfontaine/myapp:1.0 Creating axelfontaine/myapp ... Pushing axelfontaine/myapp:1.0 ... Verifying axelfontaine/myapp:1.0 ... Creating Elastic IP ... Mapping myapp-axelfontaine.boxfuse.io to 52.28.233.167 ... Waiting for AWS to create an AMI for axelfontaine/myapp:1.0 in eu-central-1 (this may take up to 50 seconds) ... AMI created in 00:23.557s -> ami-d23f38cf Creating security group boxfuse-sg_axelfontaine/myapp:1.0 ... Launching t2.micro instance of axelfontaine/myapp:1.0 (ami-d23f38cf) in eu-central-1 ... Instance launched in 00:30.306s -> i-92ef9f53 Waiting for AWS to boot Instance i-92ef9f53 and Payload to start at https://52.28.235.61/ ... Payload started in 00:29.266s -> https://52.28.235.61/ Remapping Elastic IP 52.28.233.167 to i-92ef9f53 ... Waiting 15s for AWS to complete Elastic IP Zero Downtime transition ... Deployment completed successfully. axelfontaine/myapp:1.0 is up and running at https://myapp-axelfontaine.boxfuse.io/
您的应用程序现在应该在 AWS 上启动并运行。
请参阅有关在 EC2 上部署 Spring Boot 应用程序的博客文章以及 CloudCaptain Spring Boot 集成的文档,以开始使用 Maven 构建来运行该应用程序。
1.7. 蔚蓝
本入门指南将指导你将 Spring Boot 应用程序部署到 Azure Spring Cloud 或 Azure 应用服务。
1.8. 谷歌云
Google Cloud 有多个选项可用于启动 Spring Boot 应用程序。 最容易上手的可能是 App Engine,但您也可以找到在使用 Container Engine 的容器中或在使用 Compute Engine 的虚拟机上运行 Spring Boot 的方法。
要在 App Engine 中运行,您可以先在界面中创建一个项目,该项目会为您设置唯一标识符,并设置 HTTP 路由。 将 Java 应用程序添加到项目并将其留空,然后使用 Google Cloud SDK 从命令行或 CI 构建将您的 Spring Boot 应用程序推送到该插槽中。
App Engine Standard 要求您使用 WAR 打包。 请按照以下步骤将 App Engine Standard 应用部署到 Google Cloud。
或者,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 插件),如以下示例所示:
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>appengine-maven-plugin</artifactId>
<version>1.3.0</version>
<configuration>
<project>myproject</project>
</configuration>
</plugin>
然后使用mvn appengine:deploy
(如果需要先进行身份验证,则构建失败)。
2. 安装 Spring Boot 应用程序
除了使用java -jar
直接,也可以将它们运行为systemd
,init.d
或 Windows 服务。
2.1. 安装为 systemd 服务
systemd
是 System V init 系统的后继者,现在被许多现代 Linux 发行版使用。
Spring Boot 应用程序可以通过使用systemd
'service' 脚本。
假设您有一个 Spring Boot 应用程序打包为 uber jar/var/myapp
,将其安装为systemd
服务,创建一个名为myapp.service
并将其放入/etc/systemd/system
目录。
以下脚本提供了一个示例:
[Unit] Description=myapp After=syslog.target network.target [Service] User=myapp Group=myapp Environment="JAVA_HOME=/path/to/java/home" ExecStart=${JAVA_HOME}/bin/java -jar /var/myapp/myapp.jar ExecStop=/bin/kill -15 $MAINPID SuccessExitStatus=143 [Install] WantedBy=multi-user.target
记得将Description ,User ,Group ,Environment 和ExecStart 字段。 |
这ExecStart 字段未声明脚本作命令,这意味着run 默认使用命令。 |
运行应用程序的用户、PID 文件和控制台日志文件由systemd
本身,因此必须使用“服务”脚本中的相应字段进行配置。
有关更多详细信息,请参阅服务单元配置手册页。
要将应用程序标记为在系统启动时自动启动,请使用以下命令:
$ systemctl enable myapp.service
执行man systemctl
了解更多详情。
2.2. 安装为 init.d 服务(System V)
将应用程序用作init.d
服务,配置其构建以生成完全可执行的 jar。
完全可执行的 jar 通过在文件前面嵌入一个额外的脚本来工作。
目前,某些工具不接受此格式,因此您可能并不总是能够使用此技术。
例如jar -xf 可能无法静默地提取已完全可执行的 jar 或 war。
建议您仅在打算直接执行 jar 或 war 时才使它完全可执行,而不是使用java -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 配置:
tasks.named('bootJar') {
launchScript()
}
然后可以将其符号链接到init.d
支持标准start
,stop
,restart
和status
命令。
添加到完全可执行的 jar 中的默认启动脚本支持大多数 Linux 发行版,并在 CentOS 和 Ubuntu 上进行了测试。 其他平台,例如 OS X 和 FreeBSD,需要使用自定义脚本。 默认脚本支持以下功能:
-
以拥有 jar 文件的用户身份启动服务
-
使用
/var/run/<appname>/<appname>.pid
-
将控制台日志写入
/var/log/<appname>.log
假设您在/var/myapp
,将 Spring Boot 应用程序安装为init.d
服务中,创建一个符号链接,如下所示:
$ sudo ln -s /var/myapp/myapp.jar /etc/init.d/myapp
安装后,您可以以通常的方式启动和停止服务。例如,在基于 Debian 的系统上,您可以使用以下命令启动它:
$ service myapp start
如果应用程序无法启动,请检查写入/var/log/<appname>.log 对于错误。 |
还可以使用标准作系统工具将应用程序标记为自动启动。 例如,在 Debian 上,您可以使用以下命令:
$ update-rc.d myapp defaults <priority>
2.2.1. 保护 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
用户。
为了减少应用程序用户帐户被泄露的机会,您应该考虑阻止它使用登录 shell。
例如,您可以将帐户的 shell 设置为/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
2.2.2. 自定义启动脚本
Maven 或 Gradle 插件编写的默认嵌入式启动脚本可以通过多种方式进行自定义。
对于大多数人来说,使用默认脚本和一些自定义通常就足够了。
如果您发现无法自定义所需的内容,请使用embeddedLaunchScript
完全编写您自己的文件的选项。
在编写启动脚本时自定义它
在将启动脚本写入 jar 文件时自定义其元素通常是有意义的。 例如,init.d 脚本可以提供“描述”。 由于您预先知道描述(并且不需要更改),因此您不妨在生成 jar 时提供它。
要自定义书面元素,请使用embeddedLaunchScriptProperties
Spring Boot Maven 插件的选项或properties
Spring Boot Gradle 插件的属性launchScript
.
默认脚本支持以下属性替换:
名称 | 描述 | Gradle 默认值 | Maven 默认值 |
---|---|---|---|
|
脚本模式。 |
|
|
|
这 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
单行版本 |
|
|
|
|
|
|
|
|
|
|
的默认值 |
包含 jar 的文件夹 |
包含 jar 的文件夹 |
|
对应在默认启动脚本中内联的文件脚本的引用。这可用于设置环境变量,例如 |
||
|
默认值 |
||
|
默认值 |
||
|
默认值 |
||
|
PID 文件名称的默认值 |
||
|
无论 |
|
|
|
默认值 |
60 |
60 |
在脚本运行时自定义脚本
对于编写 jar 后需要自定义的脚本项,可以使用环境变量或配置文件。
默认脚本支持以下环境属性:
变量 | 描述 |
---|---|
|
作的“模式”。默认值取决于 jar 的构建方式,但通常是 |
|
将用于运行应用程序的用户。如果未设置,则将使用拥有 jar 文件的用户。 |
|
无论 |
|
pid 文件夹的根名称 ( |
|
用于放置日志文件的文件夹的名称 ( |
|
从中读取 .conf 文件的文件夹的名称(默认情况下与 jar-file 相同的文件夹)。 |
|
日志文件的名称 |
|
应用程序的名称。如果 jar 是从符号链接运行的,则脚本会猜测应用程序名称。如果它不是符号链接,或者您想要显式设置应用程序名称,这可能很有用。 |
|
要传递给程序(Spring Boot 应用程序)的参数。 |
|
的位置 |
|
启动 JVM 时传递给 JVM 的选项。 |
|
jar 文件的显式位置,如果脚本用于启动实际未嵌入的 jar。 |
|
如果不为空,则将 |
|
在强制关闭之前停止应用程序时等待的时间(以秒为单位)( |
这PID_FOLDER ,LOG_FOLDER 和LOG_FILENAME 变量仅对init.d 服务。
为systemd ,则使用“service”脚本进行等效的自定义。
有关更多详细信息,请参阅服务单元配置手册页。 |
使用 Conf Gile
但JARFILE
和APP_NAME
,则可以使用.conf
文件。
该文件应位于 jar 文件旁边,并且名称相同,但后缀为.conf
而不是.jar
.
例如,名为/var/myapp/myapp.jar
使用名为/var/myapp/myapp.conf
,如以下示例所示:
JAVA_OPTS=-Xmx1024M LOG_FOLDER=/custom/log/folder
如果您不喜欢将配置文件放在 jar 文件旁边,您可以将CONF_FOLDER environment 变量来自定义配置文件的位置。 |
要了解如何适当地保护此文件,请参阅保护 init.d 服务的指南。
3. 接下来要读什么
有关 PaaS 可以提供的功能类型的更多信息,请参阅 Cloud Foundry、Heroku、OpenShift 和 Boxfuse 网站。 这些只是四个最受欢迎的 Java PaaS 提供商。 由于 Spring Boot 非常适合基于云的部署,因此您也可以自由考虑其他提供商。
下一节将继续介绍 Spring Boot CLI,或者您可以跳转到阅读有关构建工具插件的信息。