Убедитесь, что 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:...
детали установщика
- Необязательный клиентский скрипт установки сообщает об обнаружении 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());
}