Skip to content

Commit d3a8ac6

Browse files
Handle special chars in JAVA_HOME in elasticsearch-service.bat (#52676) (#53057)
* Handle special chars in JAVA_HOME in elasticsearch-service.bat (#52676) * Test case for windows service where JAVA_HOME path contains spaces (#53028) Co-authored-by: Muhammad Shaheer Akram <41253927+shaheerakr@users.noreply.github.com>
1 parent 6cece3a commit d3a8ac6

File tree

3 files changed

+35
-2
lines changed

3 files changed

+35
-2
lines changed

distribution/src/bin/elasticsearch-service.bat

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ rem - fourth, ergonomic JVM options are applied
123123
if not "%ES_JAVA_OPTS%" == "" set ES_JAVA_OPTS=%ES_JAVA_OPTS: =;%
124124

125125
@setlocal
126-
for /F "usebackq delims=" %%a in (`"%JAVA% -cp "!ES_CLASSPATH!" "org.elasticsearch.tools.launchers.JvmOptionsParser" "!ES_PATH_CONF!" || echo jvm_options_parser_failed"`) do set ES_JAVA_OPTS=%%a
126+
for /F "usebackq delims=" %%a in (`CALL %JAVA% -cp "!ES_CLASSPATH!" "org.elasticsearch.tools.launchers.JvmOptionsParser" "!ES_PATH_CONF!" ^|^| echo jvm_options_parser_failed`) do set ES_JAVA_OPTS=%%a
127127
@endlocal & set "MAYBE_JVM_OPTIONS_PARSER_FAILED=%ES_JAVA_OPTS%" & set ES_JAVA_OPTS=%ES_JAVA_OPTS%
128128

129129
if "%MAYBE_JVM_OPTIONS_PARSER_FAILED%" == "jvm_options_parser_failed" (

qa/os/src/test/java/org/elasticsearch/packaging/test/ArchiveTests.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import static org.hamcrest.CoreMatchers.is;
5353
import static org.hamcrest.CoreMatchers.not;
5454
import static org.hamcrest.Matchers.isEmptyString;
55+
import static org.hamcrest.Matchers.startsWith;
5556
import static org.junit.Assume.assumeFalse;
5657
import static org.junit.Assume.assumeThat;
5758
import static org.junit.Assume.assumeTrue;
@@ -104,12 +105,29 @@ public void test31BadJavaHome() throws Exception {
104105
sh.getEnv().put("JAVA_HOME", "doesnotexist");
105106

106107
// ask for elasticsearch version to quickly exit if java is actually found (ie test failure)
107-
final Result runResult = sh.runIgnoreExitCode(bin.elasticsearch.toString() + " -v");
108+
final Result runResult = sh.runIgnoreExitCode(bin.elasticsearch.toString() + " -V");
108109
assertThat(runResult.exitCode, is(1));
109110
assertThat(runResult.stderr, containsString("could not find java in JAVA_HOME"));
110111

111112
}
112113

114+
public void test32SpecialCharactersInJdkPath() throws Exception {
115+
final Installation.Executables bin = installation.executables();
116+
assumeTrue("Only run this test when we know where the JDK is.", distribution().hasJdk);
117+
118+
final Path relocatedJdk = installation.bundledJdk.getParent().resolve("a (special) path");
119+
sh.getEnv().put("JAVA_HOME", relocatedJdk.toString());
120+
121+
try {
122+
mv(installation.bundledJdk, relocatedJdk);
123+
// ask for elasticsearch version to avoid starting the app
124+
final Result runResult = sh.run(bin.elasticsearch.toString() + " -V");
125+
assertThat(runResult.stdout, startsWith("Version: "));
126+
} finally {
127+
mv(relocatedJdk, installation.bundledJdk);
128+
}
129+
}
130+
113131
public void test50StartAndStop() throws Exception {
114132
// cleanup from previous test
115133
rm(installation.config("elasticsearch.keystore"));

qa/os/src/test/java/org/elasticsearch/packaging/test/WindowsServiceTests.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,21 @@ public void test15RemoveNotInstalled() {
146146
assertThat(result.stdout, containsString("Failed removing '" + DEFAULT_ID + "' service"));
147147
}
148148

149+
public void test16InstallSpecialCharactersInJdkPath() throws IOException {
150+
assumeTrue("Only run this test when we know where the JDK is.", distribution().hasJdk);
151+
final Path relocatedJdk = installation.bundledJdk.getParent().resolve("a (special) jdk");
152+
sh.getEnv().put("JAVA_HOME", relocatedJdk.toString());
153+
154+
try {
155+
mv(installation.bundledJdk, relocatedJdk);
156+
Result result = sh.run(serviceScript + " install");
157+
assertThat(result.stdout, containsString("The service 'elasticsearch-service-x64' has been installed."));
158+
} finally {
159+
sh.runIgnoreExitCode(serviceScript + " remove");
160+
mv(relocatedJdk, installation.bundledJdk);
161+
}
162+
}
163+
149164
public void test20CustomizeServiceId() {
150165
String serviceId = "my-es-service";
151166
String displayName = DEFAULT_DISPLAY_NAME.replace(DEFAULT_ID, serviceId);

0 commit comments

Comments
 (0)