Подтвердить что ты не робот

Почему установщик Java SDK не установил JAVA_HOME?

Я всегда задавался вопросом, почему мне нужно вручную установить переменную среды JAVA_HOME после установки Java SDK.

JAVA_HOME = c:\Program Files\Java\jdk1.6.0_12

Visual Studio по крайней мере предоставляет пакетный файл для установки таких переменных среды:

вызов "c:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"

Есть ли что-то подобное в Java? Я пытаюсь создать конструкцию script, которая должна просто работать после установки Java SDK. Я не хочу, чтобы люди путались с переменными среды на своем ПК.

4b9b3361

Ответ 1

Вы можете установить столько версий Java, сколько захотите.

Для установки было бы опасно изменить переменную среды локальная, например JAVA_HOME, так как она может ссылаться на существующую установку Java.

Это не имеет ничего общего с предполагаемой "проблемой, зависящей от платформы".;)

Поскольку сценарии могут зависеть от JAVA_HOME для запуска самих себя, опять же, для новой установки для Java будет изменяться JAVA_HOME: все эти скрипты внезапно должны быть запущены с новой потенциально несовместимой JVM.

Кроме того, установив $JAVA_HOME/bin или %JAVA_HOME%/bin в свой путь, вы можете динамически изменить JAVA_HOME на любую версию Java, которую хотите использовать, не имея большого значения с помощью переменной PATH.


Майкл Боргвардт сделал в комментариях интересный вопрос о последующей деятельности

Тем не менее, это не объясняет, почему установщик не устанавливает JAVA_HOME, когда он еще не установлен ранее.

Ответ прост:

Настройка не может знать, зависит ли script от JAVA_HOME или не.

Значение: некоторые скрипты могут тестировать значение JAVA_HOME, а если не заданы, обратитесь к другому JVM, установленному в другом месте (и не забывайте, что с помощью "install" можно ссылаться только на "скопированные": JDK/JRE не всегда устанавливается установкой)

Если вы установите JAVA_HOME, это может нарушить поведение по умолчанию некоторых ваших скриптов.

Не желая нарушать гипотетические сценарии, зависящие от env var, которые не устанавливаются для меня бессознательно параноидальным - если это делает script, то, очевидно, WANTS использует другую JVM при установке - нет причин избегать что.

Ммм... Сладкий. Для решения массивных задач развертывания на ежедневной основе (для внутреннего применения в моем магазине), я могу заверить вас: это очень здраво "параноидальный" лечить. Когда вы развертываете (очень) большой набор пользователей, вы не хотите делать какие-либо предположения о своей платформе и конфигурациях. "ЧТОБЫ БЫТЬ" - это предположение, которое я бы не осмелился сделать (или я перенаправляю свой телефон к вашему;), и вы обрабатываете сердитые вызовы).

Например, у нас есть много сценариев, запускаемых с 1.4.2 JVM от солнца (JAVA_HOME не установлен на платформе разработки, путь по умолчанию установлен непосредственно в script), или с 1.4.2 от JRockit (JAVA_HOME установленный, поскольку он является целевой целью интеграции, предпроизводственных и производственных платформ).

Но мы регулярно устанавливаем новый JDK1.6.x, поскольку мы используем его для запуска eclipse.

Предположим, что эти сценарии хотят, чтобы их набор JAVA_HOME... и ничего больше не работает.

... На что Роберт Грант делает этого критика на месте:

Вы описываете сценарии, которые требуют одной конкретной версии, но все равно смотрите на глобальный JAVA_HOME. Это просто плохо продуманные скрипты.

Хотя это может быть или не быть правдой, это также точно иллюстрирует мою точку зрения:
"вы не хотите делать какие-либо предположения": никаких предположений на их платформе/настройках и никаких предположений об их "лучших практиках".
Первый может казаться параноидальным, последнее - обычным здравым смыслом: думая, что ваш продукт (здесь JDK-настройка) не сломает ничего в пользовательской среде, потому что пользователь "правильно" продумал свои скрипты... был бы сумасшедшим.


GvS предлагает:

Или у него просто есть возможность сделать это, отключено по умолчанию

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

Это просто не стоит.

Ответ 2

Я не думаю, что JAVA_HOME - это соглашение, изобретенное или поддерживаемое Sun.

Они, вероятно, помнят фиаско, которое было переменной среды CLASSPATH ** слишком хорошо, и предпочитают держаться подальше от переменных среды.

** Это было предложено в качестве основного способа установить путь класса JVM в более ранних Java SDK и литературе и привело к тому, что пользователь и различные приложения возились с переменной среды, перезаписывая друг друга и в зависимости от взаимно противоречивого содержимого.

Ответ 3

Механизм vcvarsall.bat - это удобный способ для Visual С++ предоставить консоль с правильными переменными, не вмешиваясь в переменные пользовательской/системной среды. Однако он предполагает, что Installshield - единственный способ получить код в системе. JDK должен терпеть, чтобы быть отрезанными от одного места к другому.

Если вы ищете java.exe, установщик Installshield должен поместить его в% windir%\system32, поэтому он доступен в PATH.

Вы можете получить некоторые подсказки относительно местоположения установленных приложений, запросив реестр:

C:>REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\1.6" /v JavaHome

! REG.EXE VERSION 3.0

HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\1.6
    JavaHome    REG_SZ  C:\dev\Java\jdk1.6.0_05

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

Ответ 4

Я не уверен, почему это происходит, потому что установщики четко решают проблемы, зависящие от платформы (это, конечно же, цель JVM). Вы уверены, что не смешиваете JRE с JSDK?

Может быть, есть способ, чтобы ваша программа искала, где установлена ​​Java (это будет script, я думаю), а затем установите JAVA_HOME и, возможно, добавьте ее в путь.

IBM, похоже, уже делает этот трюк: http://www-01.ibm.com/support/docview.wss?rs=180&uid=swg21199220

Другие интересные сообщения, намекающие на разницу между установками JRE и JSDK: http://confluence.atlassian.com/display/CONF26/Set+JAVA_HOME+variable+in+Windows

Надеюсь, что это поможет.

Ответ 5

Это может помочь кому-то другому, кто окажется здесь, как я. Я просто хочу использовать Java как инструмент, а не воспринимать его как образ жизни, поэтому мне нужно было только знать, как JAVA_HOME собирался и почему это было неправильно. Ответ оказался тем, что установка WinAnt устанавливает JAVA_HOME (вместе с ANT_HOME), но только на основе установленной Java. Поэтому, если вам нужно изменить версию Java, и вы используете Ant, правильный способ сделать это - удалить WinAnt, удалить Java, установить новую Java и затем переустановить WinAnt.

Ответ 6

Я думаю, что Java не хочет делать ничего, что зависит от платформы. В Windows пути к классам устанавливаются иначе, чем LINUX/UNIX.