Skip to content

Commit 14cd39f

Browse files
committed
Bat scripts to work with JAVA_HOME with parantheses
the elasticsearch.bat and elasticsearch-env.bat won't work if JAVA contains parentheses. This seems to be the limitation of FOR /F IN (command) DO syntax. The JAVA variable present in a command contains a path to a binary to start elasticsearch (with spaces & parans). We can workaround the problem of spaces and parentheses in this path by referring this variable with a CALL command. Note that executing binaries with CALL is an undocumented behaviour (but works)
1 parent 4615e72 commit 14cd39f

File tree

3 files changed

+40
-7
lines changed

3 files changed

+40
-7
lines changed

distribution/src/bin/elasticsearch-env.bat

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,5 +58,5 @@ set ES_DISTRIBUTION_FLAVOR=${es.distribution.flavor}
5858
set ES_DISTRIBUTION_TYPE=${es.distribution.type}
5959

6060
if not defined ES_TMPDIR (
61-
for /f "tokens=* usebackq" %%a in (`"%JAVA% -cp "!ES_CLASSPATH!" "org.elasticsearch.tools.launchers.TempDirectory""`) do set ES_TMPDIR=%%a
61+
for /f "tokens=* usebackq" %%a in (`CALL %JAVA% -cp "!ES_CLASSPATH!" "org.elasticsearch.tools.launchers.TempDirectory"`) do set ES_TMPDIR=%%a
6262
)

distribution/src/bin/elasticsearch.bat

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,10 @@ IF ERRORLEVEL 1 (
4141
EXIT /B %ERRORLEVEL%
4242
)
4343

44-
set "ES_JVM_OPTIONS=%ES_PATH_CONF%\jvm.options"
44+
set ES_JVM_OPTIONS=%ES_PATH_CONF%\jvm.options
4545
@setlocal
46-
for /F "usebackq delims=" %%a in (`"%JAVA% -cp "!ES_CLASSPATH!" "org.elasticsearch.tools.launchers.JvmOptionsParser" "!ES_JVM_OPTIONS!" || echo jvm_options_parser_failed"`) do set JVM_OPTIONS=%%a
46+
for /F "usebackq delims=" %%a in (`CALL %JAVA% -cp "!ES_CLASSPATH!" "org.elasticsearch.tools.launchers.JvmOptionsParser" "!ES_JVM_OPTIONS!"
47+
^|^| echo jvm_options_parser_failed`) do set JVM_OPTIONS=%%a
4748
@endlocal & set "MAYBE_JVM_OPTIONS_PARSER_FAILED=%JVM_OPTIONS%" & set ES_JAVA_OPTS=%JVM_OPTIONS:${ES_TMPDIR}=!ES_TMPDIR!% %ES_JAVA_OPTS%
4849

4950
if "%MAYBE_JVM_OPTIONS_PARSER_FAILED%" == "jvm_options_parser_failed" (

qa/vagrant/src/main/java/org/elasticsearch/packaging/test/ArchiveTestCase.java

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,15 @@
2222
import com.carrotsearch.randomizedtesting.annotations.TestCaseOrdering;
2323
import org.apache.http.client.fluent.Request;
2424
import org.elasticsearch.packaging.util.Archives;
25+
import org.elasticsearch.packaging.util.Distribution;
26+
import org.elasticsearch.packaging.util.Installation;
2527
import org.elasticsearch.packaging.util.Platforms;
2628
import org.elasticsearch.packaging.util.ServerUtils;
2729
import org.elasticsearch.packaging.util.Shell;
2830
import org.elasticsearch.packaging.util.Shell.Result;
2931
import org.junit.Before;
3032
import org.junit.BeforeClass;
3133

32-
import org.elasticsearch.packaging.util.Distribution;
33-
import org.elasticsearch.packaging.util.Installation;
34-
3534
import java.io.IOException;
3635
import java.nio.file.Files;
3736
import java.nio.file.Path;
@@ -40,9 +39,9 @@
4039

4140
import static java.util.stream.Collectors.joining;
4241
import static org.elasticsearch.packaging.util.Archives.ARCHIVE_OWNER;
43-
import static org.elasticsearch.packaging.util.Cleanup.cleanEverything;
4442
import static org.elasticsearch.packaging.util.Archives.installArchive;
4543
import static org.elasticsearch.packaging.util.Archives.verifyArchiveInstallation;
44+
import static org.elasticsearch.packaging.util.Cleanup.cleanEverything;
4645
import static org.elasticsearch.packaging.util.FileMatcher.Fileness.File;
4746
import static org.elasticsearch.packaging.util.FileMatcher.file;
4847
import static org.elasticsearch.packaging.util.FileMatcher.p660;
@@ -193,6 +192,39 @@ public void test50StartAndStop() throws IOException {
193192
Archives.stopElasticsearch(installation);
194193
}
195194

195+
public void test51JavaHomeContainParansAndSpace() throws IOException {
196+
assumeThat(installation, is(notNullValue()));
197+
198+
Platforms.onWindows(() -> {
199+
final Shell sh = new Shell();
200+
final String originalPath = sh.run("$Env:PATH").stdout.trim();
201+
final String javaHome = sh.run("$Env:JAVA_HOME").stdout.trim();
202+
203+
try {
204+
final String newPath = Arrays.stream(originalPath.split(";"))
205+
.filter(path -> path.contains("Java") == false)
206+
.collect(joining(";"));
207+
208+
sh.runIgnoreExitCode("cmd /c mklink /D 'C:\\Program Files (x86)\\java' $Env:JAVA_HOME");
209+
210+
sh.getEnv().put("PATH", newPath);
211+
sh.getEnv().put("JAVA_HOME", "C:\\Program Files (x86)\\java");
212+
213+
Archives.runElasticsearch(installation, sh);
214+
215+
Archives.stopElasticsearch(installation);
216+
} catch (IOException e) {
217+
logger.error("Test failed with exception", e);
218+
}finally {
219+
//clean up sym link
220+
sh.runIgnoreExitCode("cmd /c del /F /Q 'C:\\Program Files (x86)\\java' ");
221+
sh.getEnv().put("PATH", originalPath);
222+
sh.getEnv().put("JAVA_HOME", javaHome);
223+
224+
}
225+
});
226+
}
227+
196228
public void test60AutoCreateKeystore() {
197229
assumeThat(installation, is(notNullValue()));
198230

0 commit comments

Comments
 (0)