This is an automated email from the ASF dual-hosted git repository. tallison pushed a commit to branch branch_1x in repository https://gitbox.apache.org/repos/asf/tika.git
The following commit(s) were added to refs/heads/branch_1x by this push: new 0f7e86c TIKA-2753 -- use -javaHome or $JAVA_HOME when starting child process w -spawnChild mode in tika-server 0f7e86c is described below commit 0f7e86cced275c2db3e2456685acf24fcf44e286 Author: TALLISON <talli...@apache.org> AuthorDate: Fri Oct 12 11:44:34 2018 -0400 TIKA-2753 -- use -javaHome or $JAVA_HOME when starting child process w -spawnChild mode in tika-server # Conflicts: # CHANGES.txt --- CHANGES.txt | 3 +- .../java/org/apache/tika/utils/ProcessUtils.java | 3 +- .../java/org/apache/tika/server/TikaServerCli.java | 3 +- .../org/apache/tika/server/TikaServerWatchDog.java | 41 ++++++++++++++++++++-- 4 files changed, 45 insertions(+), 5 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 5f45479..1f793d2 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,6 +1,7 @@ Release 1.20 - ??? - + * Use -javaHome or $JAVA_HOME (if they exist) when + spawning child in tika-server's -spawnChild mode. Release 1.19.1 - 10/4/2018 diff --git a/tika-core/src/main/java/org/apache/tika/utils/ProcessUtils.java b/tika-core/src/main/java/org/apache/tika/utils/ProcessUtils.java index 83beda2..dba1893 100644 --- a/tika-core/src/main/java/org/apache/tika/utils/ProcessUtils.java +++ b/tika-core/src/main/java/org/apache/tika/utils/ProcessUtils.java @@ -33,7 +33,8 @@ public class ProcessUtils { } //need to test for " " on windows, can't just add double quotes //across platforms. - if (arg.contains(" ") && SystemUtils.IS_OS_WINDOWS) { + if (arg.contains(" ") && SystemUtils.IS_OS_WINDOWS && + (!arg.startsWith("\"") && !arg.endsWith("\""))) { arg = "\"" + arg + "\""; } return arg; diff --git a/tika-server/src/main/java/org/apache/tika/server/TikaServerCli.java b/tika-server/src/main/java/org/apache/tika/server/TikaServerCli.java index ef95a32..d63a515 100644 --- a/tika-server/src/main/java/org/apache/tika/server/TikaServerCli.java +++ b/tika-server/src/main/java/org/apache/tika/server/TikaServerCli.java @@ -84,7 +84,7 @@ public class TikaServerCli { private static final List<String> ONLY_IN_SPAWN_CHILD_MODE = Arrays.asList(new String[] { "taskTimeoutMillis", "taskPulseMillis", - "pingTimeoutMillis", "pingPulseMillis", "maxFiles"}); + "pingTimeoutMillis", "pingPulseMillis", "maxFiles", "javaHome"}); private static Options getOptions() { Options options = new Options(); @@ -106,6 +106,7 @@ public class TikaServerCli { options.addOption("pingPulseMillis", true, "Only in spawn child mode: how often to check if a ping has timed out."); options.addOption("maxFiles", true, "Only in spawn child mode: shutdown server after this many files -- use only in 'spawnChild' mode"); + options.addOption("javaHome", true, "Override system property JAVA_HOME for calling java for the child process"); options.addOption("child", false, "this process is a child process -- EXPERT -- " + "should normally only be invoked by parent process"); return options; diff --git a/tika-server/src/main/java/org/apache/tika/server/TikaServerWatchDog.java b/tika-server/src/main/java/org/apache/tika/server/TikaServerWatchDog.java index abd5663..2452430 100644 --- a/tika-server/src/main/java/org/apache/tika/server/TikaServerWatchDog.java +++ b/tika-server/src/main/java/org/apache/tika/server/TikaServerWatchDog.java @@ -18,6 +18,8 @@ package org.apache.tika.server; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.tika.utils.ProcessUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,10 +27,14 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.nio.file.Paths; import java.time.Duration; import java.time.Instant; import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.Optional; import java.util.concurrent.TimeUnit; public class TikaServerWatchDog { @@ -123,11 +129,40 @@ public class TikaServerWatchDog { if (args[i].startsWith("-J") || args[i].equals("-spawnChild") || args[i].equals("--spawnChild")) { continue; } + if (args[i].equals("-javaHome")) { + if (i == args.length-1) { + throw new IllegalArgumentException("must specify a value for -javaHome"); + } + i++;//skip argument value + continue; + } + argList.add(args[i]); } return argList; } + private static String extractJavaPath(String[] args) { + String javaHome = null; + for (int i = 0; i < args.length; i++) { + if (args[i].equals("-javaHome")) { + if (i == args.length-1) { + throw new IllegalArgumentException("must specify a value for -javaHome"); + } + javaHome = args[i+1]; + break; + } + } + if (javaHome == null) { + javaHome = System.getenv("JAVA_HOME"); + } + if (javaHome != null) { + Path jPath = Paths.get(javaHome).resolve("bin").resolve("java"); + return ProcessUtils.escapeCommandLine( + jPath.toAbsolutePath().toString()); + } + return "java"; + } private static List<String> extractJVMArgs(String[] args) { List<String> jvmArgs = new ArrayList<>(); boolean foundHeadlessOption = false; @@ -231,9 +266,11 @@ public class TikaServerWatchDog { ProcessBuilder builder = new ProcessBuilder(); builder.redirectError(ProcessBuilder.Redirect.INHERIT); List<String> argList = new ArrayList<>(); + String javaPath = extractJavaPath(args); List<String> jvmArgs = extractJVMArgs(args); List<String> childArgs = extractArgs(args); - argList.add("java"); + + argList.add(javaPath); if (! jvmArgs.contains("-cp") && ! jvmArgs.contains("--classpath")) { String cp = System.getProperty("java.class.path"); jvmArgs.add("-cp"); @@ -243,7 +280,7 @@ public class TikaServerWatchDog { argList.add("org.apache.tika.server.TikaServerCli"); argList.addAll(childArgs); argList.add("-child"); - + LOG.debug("child process commandline: " +argList.toString()); builder.command(argList); Process process = builder.start(); if (SHUTDOWN_HOOK != null) {