确保Install4j仅使用其捆绑的jre而不使用路径

时间:2017-02-02 16:58:52

标签: java install4j

问题

如何确保我的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

  • 安装程序部署jre后运行脚本报告env

`

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 个答案:

答案 0 :(得分:1)

实际上,这使我们的自定义代码出现问题。自定义代码通过java启动install4j生成的可执行文件。在命令行上启动时,首先找到错误的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());
      }