# 56.1.3 自定义启动脚本

Maven或Gradle插件生成的默认内嵌启动脚本可以通过很多方法自定义，对于大多数开发者，使用默认脚本和一些自定义通常就足够了。如果发现不能自定义需要的东西，你可以使用`embeddedLaunchScript`选项生成自己的文件。

**在脚本生成时自定义**

自定义写入jar文件的启动脚本元素是有意义的，例如，为`init.d`脚本提供`description`，既然知道这会展示到前端，你可能会在生成jar时提供它。

为了自定义写入的元素，你需要为Spring Boot Maven或Gradle插件指定`embeddedLaunchScriptProperties`选项。

以下是默认脚本支持的可代替属性：

| 名称                         | 描述                                                                                                                           |
| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `mode`                     | 脚本模式，默认为`auto`                                                                                                               |
| `initInfoProvides`         | 'INIT INFO'部分的`Provides`，对于Gradle默认为`spring-boot-application`，对于Maven默认为`${project.artifactId}`                              |
| `initInfoShortDescription` | ‘INIT INFO’部分的`Short-Description`，对于Gradle默认为`Spring Boot Application`，对于Maven默认为`${project.name}`                           |
| `initInfoDescription`      | “INIT INFO”部分的`Description`，对于Gradle默认为`Spring Boot Application`，对于Maven默认为`${project.description}`（失败会回退到`${project.name}`） |
| `initInfoChkconfig`        | “INIT INFO”部分的`chkconfig`，默认为`2345 99 01`                                                                                    |
| `confFolder`               | `CONF_FOLDER`的默认值，默认为包含jar的文件夹                                                                                               |
| `logFolder`                | `LOG_FOLDER`的默认值，只对`init.d`服务有效                                                                                              |
| `pidFolder`                | `PID_FOLDER`的默认值，只对`init.d`服务有效                                                                                              |
| `useStartStopDaemon`       | 如果`start-stop-daemon`命令可用，它会控制该实例，默认为`true`                                                                                  |

**在脚本运行时自定义**

对于需要在jar文件生成后自定义的项目，你可以使用环境变量或配置文件。

默认脚本支持以下环境变量：

| 变量                      | 描述                                                                                                       |       |        |                                           |
| ----------------------- | -------------------------------------------------------------------------------------------------------- | ----- | ------ | ----------------------------------------- |
| `MODE`                  | 操作的模式，默认值依赖于jar构建方式，通常为`auto`（意味着它会尝试通过检查它是否为`init.d`目录的软连接来推断这是不是一个init脚本）。你可以显式将它设置为`service`，这样\`stop | start | status | restart`命令就可以工作了，或如果你只是想在前台运行该脚本那只需`run\` |
| `USE_START_STOP_DAEMON` | 如果`start-stop-daemon`命令可用，它将被用来控制该实例，默认为`true`                                                           |       |        |                                           |
| `PID_FOLDER`            | pid文件夹的根目录（默认为`/var/run`）                                                                                |       |        |                                           |
| `LOG_FOLDER`            | 存放日志文件的文件夹（默认为`/var/log`）                                                                                |       |        |                                           |
| `CONF_FOLDER`           | 读取`.conf`文件的文件夹                                                                                          |       |        |                                           |
| `LOG_FILENAME`          | 存放于`LOG_FOLDER`的日志文件名（默认为`<appname>.log`）                                                                |       |        |                                           |
| `APP_NAME`              | 应用名，如果jar运行自一个软连接，脚本会猜测它的应用名。如果不是软连接，或你想显式设置应用名，这就很有用了                                                   |       |        |                                           |
| `RUN_ARGS`              | 传递给程序的参数（Spring Boot应用）                                                                                  |       |        |                                           |
| `JAVA_HOME`             | 默认使用`PATH`指定`java`的位置，但如果在`$JAVA_HOME/bin/java`有可执行文件，你可以通过该属性显式设置                                       |       |        |                                           |
| `JAVA_OPTS`             | JVM启动时传递的配置项                                                                                             |       |        |                                           |
| `JARFILE`               | 在脚本启动没内嵌其内的jar文件时显式设置jar位置                                                                               |       |        |                                           |
| `DEBUG`                 | 如果shell实例的`-x`标识有设值，则你能轻松看到脚本的处理逻辑                                                                       |       |        |                                           |

**注** `PID_FOLDER`，`LOG_FOLDER`和`LOG_FILENAME`变量只对`init.d`服务有效。对于`systemd`等价的自定义方式是使用‘service’脚本。

如果`JARFILE`和`APP_NAME`出现异常，上面的设置可以使用一个`.conf`文件进行配置。该文件预期是放到跟jar文件临近的地方，并且名字相同，但后缀为`.conf`而不是`.jar`。例如，一个命名为`/var/myapp/myapp.jar`的jar将使用名为`/var/myapp/myapp.conf`的配置文件：

**myapp.conf**

```
JAVA_OPTS=-Xmx1024M
LOG_FOLDER=/custom/log/folder
```

**注** 如果不喜欢配置文件放到jar附近，你可以使用`CONF_FOLDER`环境变量指定文件的位置。

想要学习如何正确的保护文件可以参考[the guidelines for securing an init.d service.](https://github.com/cwiki-us-spring-guides/Spring-Boot-Reference-Guide/tree/0047aa8098a650dde0c93f4d2e91754c83468c4b/VI.%20Deploying%20Spring%20Boot%20applications/the%20guidelines%20for%20securing%20an%20init.d%20service)。
