【问题标题】:Ensure Install4j Uses only its bundled jre and never Java found by path确保 Install4j 仅使用其捆绑的 jre,而不是通过路径找到 Java
【发布时间】:2017-02-03 02:02:19
【问题描述】:

问题

如何确保我的 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 后运行脚本报告环境

`

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;

【问题讨论】:

    标签: java install4j


    【解决方案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());
          }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-22
      • 1970-01-01
      • 1970-01-01
      • 2018-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多