Убедитесь, что Install4j использует только свой jre и никогда не находит Java по пути

вопрос

Как я могу убедиться, что мой установщик install4j всегда находит только Java?

  • Могу ли я создать установщик верхнего уровня, который устанавливает JRE в tmp, устанавливает переменные env и затем запускает сам установщик?
  • Можно ли загрузить файл vm во время установки?

проблема

Install4j находит Java 1.7 во время установки, что влияет на пользовательский код, препятствующий успешной установке. Я вижу найденный java7 перед развертыванием файла - хорошо, ожидаемый, учитывая, что JRE еще не был распакован.

Доказательства я создал простой установщик и вижу следующее:

BEFORE PATH=/opt/tools/Java/jdk1.7.0_79/bin:... JAVA_HOME=/opt/tools/Java/jdk1.7.0_79 ... ENV [JAVA_HOME] /opt/tools/Java/jdk1.7.0_79 ENV [PATH] /opt/tools/Java/jdk1.7.0_79/bin:...

детали установщика

envTest.install4j

  • Необязательный клиентский скрипт установки сообщает об обнаружении Java до начала выполнения

echo BEFORE echo PATH=$PATH echo JAVA_HOME=$JAVA_HOME echo Version: java -version

  • Запустите сценарий создания отчетов env после того, как установщик развернет jre

`

import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;

Map<String, String> envMap = System.getenv();
SortedMap<String, String> sortedEnvMap = new TreeMap<String, String>(envMap);
Set<String> keySet = sortedEnvMap.keySet();
for (String key : keySet) {
    String value = envMap.get(key);
    Util.logInfo(this,"ENV [" + key + "] " + value);
}
return true;

1 ответ

На самом деле, это превратило нас в проблему с моим пользовательским кодом. Пользовательский код запускает сгенерированный install4j исполняемый файл через Java. При запуске в командной строке с неправильным обнаружением Java, программа запуска использует только свою собственную Java. При запуске из моего расширения это не удается.

Решение - установить Java в моем расширении:

  private File getInstalledJREDir() {
    return new File(installationDir, "jre");
  }

  private String addJREToFrontOfPathVar() {
    File jreBinDir = new File(getInstalledJREDir(), "bin");
    String path = System.getenv().get("PATH");
    if (null == path) {
      path = jreBinDir.getAbsolutePath();
    } else {
      path = jreBinDir.getAbsolutePath() + File.pathSeparator + path;
    }
    return path;
  }

  /**
   * Start Laucnher and block until it starts or timeout reached
   * @throws AutoRunException
   */
  public  void run() throws AutoRunException, IOException, InterruptedException {
    notifier.setPhase("Starting Agent");

    // Set Directories
    File dataDir = new File(installationDir.getParentFile(), "data-agent");
    File agentLog = new File(logDir,"agent.log");

    if (! isWindows()) {
      File agent = new File(installationDir, "bin/launcherExecutable");

      CmdExecutor ce = new CmdExecutor(agent, agentLog);

      // Ensure our installed JRE found 1st - PLAT-38833
      ce.updateEnvironmentVariable("JAVA_HOME", getInstalledJREDir().getAbsolutePath());
      ce.updateEnvironmentVariable("PATH", addJREToFrontOfPathVar());


      ce.setWorkingDir(installationDir);
      ce.setArgLine(String.format("--datadir %s", dataDir.getAbsolutePath()));

      notifier.logInfo("Starting " + agent + " with " + ce.getArgLine());
      if (! ce.run(true) ) {
        throw new AutoRunException("Agent failed to start " + ce.getOutput());
      }
Другие вопросы по тегам