В чем разница между JDK_JAVA_OPTIONS и JAVA_TOOL_OPTIONS при использовании Java 11? - PullRequest
0 голосов
/ 25 октября 2018

Какова точная разница между JDK_JAVA_OPTIONS и JAVA_TOOL_OPTIONS при использовании Java 11?

Они, кажется, делают то же самое, но вывод немного отличается.Это заставляет меня поверить, что они могут иметь разные варианты использования:

$ JDK_JAVA_OPTIONS="-Dstuff" java Foo
NOTE: Picked up JDK_JAVA_OPTIONS: -Dstuff

$ JDK_JAVA_OPTIONS="illegalStuff" java Foo
NOTE: Picked up JDK_JAVA_OPTIONS: illegalStuff
Error: Cannot specify main class in environment variable JDK_JAVA_OPTIONS

$ JAVA_TOOL_OPTIONS="-Dstuff" java Foo
Picked up JAVA_TOOL_OPTIONS: -Dstuff

$ JAVA_TOOL_OPTIONS="illegalStuff" java Foo
Picked up JAVA_TOOL_OPTIONS: illegalStuff
Unrecognized option: illegalStuff
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

Я использую крошечную тестовую программу:

public class Yo {
  public static final void main(String[] args) {
    System.out.println(System.getProperty("stuff"));
  }
}

Это показывает, что JDK_JAVA_OPTIONS имеет приоритет над JAVA_TOOL_OPTIONS:

$ JDK_JAVA_OPTIONS="-Dstuff=jdk" JAVA_TOOL_OPTIONS="-Dstuff=tool" java Yo
NOTE: Picked up JDK_JAVA_OPTIONS: -Dstuff=jdk
Picked up JAVA_TOOL_OPTIONS: -Dstuff=tool
jdk

Но в конечном итоге командная строка побеждает:

$ JDK_JAVA_OPTIONS="-Dstuff=jdk" JAVA_TOOL_OPTIONS="-Dstuff=tool" java -Dstuff=cmd Yo
NOTE: Picked up JDK_JAVA_OPTIONS: -Dstuff=jdk
Picked up JAVA_TOOL_OPTIONS: -Dstuff=tool
cmd

При сборке читается только JAVA_TOOL_OPTIONS:

$ JDK_JAVA_OPTIONS="-Dstuff=jdk" JAVA_TOOL_OPTIONS="-Dstuff=tool" javac Yo.java
Picked up JAVA_TOOL_OPTIONS: -Dstuff=tool

I'mв настоящее время используется AdoptOpenJDK 11, сборка 28.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Функциональное различие между двумя переменными объясняется ответом @ gjoranv.

Различия в результатах, я думаю, проистекают из следующего:

  1. Две переменныепохоже, что он реализован в разных точках процесса запуска.

  2. Документация JDK_JAVA_OPTIONS гласит:

    Чтобы уменьшить потенциальное неправильное использование поведения JDK_JAVA_OPTIONS,параметры, которые задают основной класс (например, -jar) или приводят к тому, что программа запуска Java завершает работу без выполнения основного класса (например, -h), запрещены в переменной среды.Если какой-либо из этих параметров появится в переменной среды, средство запуска прекратит работу с сообщением об ошибке.

    Эта строка:

     Error: Cannot specify main class in environment variable JDK_JAVA_OPTIONS
    

    - это сообщение об ошибке, предупреждающее пользователя о потенциальной попытке испортить эту переменную.

    Я думаю, что JDK_JAVA_OPTIONS имеет преимущество, частично по той же причине.

0 голосов
/ 25 октября 2018
  • JDK_JAVA_OPTIONS выбирается только средством запуска java, поэтому используйте его для параметров, которые вы хотите применить (или только имеют смысл) для команды запуска Java.Эта переменная также является новой в JDK 9+ и будет игнорироваться более ранними версиями JDK.Следовательно, это полезно при переходе с более старых версий на 9 +.
  • JAVA_TOOL_OPTIONS также используется другими инструментами Java, такими как jar и javac, поэтому его следует использовать для флагов, которые вы хотите применить(и действительны) для всех этих инструментов Java.
...