What is the recommended way to set JVM options for

2019-06-06 14:56发布

Currently, I use export JAVA_OPTS ... on the command line, but there seem to be other possibilities, using the build.sbt or an external property file.

I have found several relevant github issues here, here and here but the many options are confusing. Is there a recommended approach?

1条回答
何必那么认真
2楼-- · 2019-06-06 15:38

The approach you take to setting JVM options depends mainly on your use case:

Inject options every time

If you want to be able to specify the options every time you run your service, the two mechanisms are environment variables, and command line parameters. Which you use is mostly a matter of taste or convenience (but command line parameters will override environment variable settings).

  • Environment variables

    You can inject values using the JAVA_OPTS environment variable. This is specified as a sequence of parameters passed directly to the java binary, with each parameter separated by whitespace.

  • Command line parameters

    You can inject values by adding command line parameters in either of two formats:

    • -Dkey=val

      Passes a Java environment property into the java binary.

    • -J-X

      Passes any flag -X to the java binary, stripping the leading -J.

Inject options from a file which can be modified

If you want to end up with a file on the filesystem which can be modified after install time, you will want to use sbt-native-packager's ability to read from a .ini file to initialise a default value for Java options. The details of this can be seen at http://www.scala-sbt.org/sbt-native-packager/archetypes/cheatsheet.html#file-application-ini-or-etc-default

Following the instructions, and depending on the archetype you are using, you will end up with a file at either /etc/default, application.ini, or another custom name, which will be read by the startup script to add settings.

Each line of this file are treated as if they were extra startup parameters, so the same rules as mentioned earlier are still enforced; e.g. -X flags need to be written as if they were -J-X.

Inject options & code which never need to be changed

You can hardcode changes directly into the shell script which is run to start your binary, by using the SBT setting bashScriptExtraDefines, and following the details at http://www.scala-sbt.org/sbt-native-packager/archetypes/cheatsheet.html#extra-defines

This is the most flexible option in terms of what is possible (you can write any valid bash code, and this is added to the start script). But it is also less flexible in that it is not modifiable afterwards; any optional calculations have to be described in terms of the bash scripting language.

查看更多
登录 后发表回答