aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/tools/launcher/java_launcher.cc
diff options
context:
space:
mode:
authorGravatar Yun Peng <pcloudy@google.com>2017-09-18 16:34:19 +0200
committerGravatar László Csomor <laszlocsomor@google.com>2017-09-18 18:14:38 +0200
commit5f09033beb51989f0720f2ddbf82a9caf13bfdac (patch)
tree7384741aa262b9cff6b3c02b6382ca5614264cc0 /src/tools/launcher/java_launcher.cc
parentfdca2aa5dd7db2bd2281b7032edbddf31a6f6c00 (diff)
Java Launcher: Create classpath jar with a random name
When the classpath is too long, the launcher creates a jar file to pass the classpath value. This change makes the jar file's name random. It fixed the bug that when running multiple instances of the same java binary, they all try to create the same classpath jar file. For example, when running java_test with shard_count > 1. Also, we delete the classpath jar file after the program finishes, so that we don't leave any garbages behind. Change-Id: I67926b3ef76dcb1806797e977ecaa7c6763c5cf2 PiperOrigin-RevId: 169087032
Diffstat (limited to 'src/tools/launcher/java_launcher.cc')
-rw-r--r--src/tools/launcher/java_launcher.cc21
1 files changed, 17 insertions, 4 deletions
diff --git a/src/tools/launcher/java_launcher.cc b/src/tools/launcher/java_launcher.cc
index 24fca5866a..e13d26833d 100644
--- a/src/tools/launcher/java_launcher.cc
+++ b/src/tools/launcher/java_launcher.cc
@@ -135,7 +135,8 @@ string JavaBinaryLauncher::CreateClasspathJar(const string& classpath) {
string binary_base_path =
GetBinaryPathWithoutExtension(this->GetCommandlineArguments()[0]);
- string jar_manifest_file_path = binary_base_path + ".jar_manifest";
+ string rand_id = "-" + GetRandomStr(10);
+ string jar_manifest_file_path = binary_base_path + rand_id + ".jar_manifest";
ofstream jar_manifest_file(jar_manifest_file_path);
jar_manifest_file << "Manifest-Version: 1.0\n";
// No line in the MANIFEST.MF file may be longer than 72 bytes.
@@ -152,7 +153,7 @@ string JavaBinaryLauncher::CreateClasspathJar(const string& classpath) {
// Create the command for generating classpath jar.
// We pass the command to cmd.exe to use redirection for suppressing output.
- string manifest_jar_path = binary_base_path + "-classpath.jar";
+ string manifest_jar_path = binary_base_path + rand_id + "-classpath.jar";
string jar_bin = this->Rlocation(this->GetLaunchInfoByKey(JAR_BIN_PATH));
vector<string> arguments;
arguments.push_back("/c");
@@ -168,6 +169,9 @@ string JavaBinaryLauncher::CreateClasspathJar(const string& classpath) {
die("Couldn't create classpath jar: %s", manifest_jar_path.c_str());
}
+ // Delete jar_manifest_file after classpath jar is created.
+ DeleteFileByPath(jar_manifest_file_path.c_str());
+
return manifest_jar_path;
}
@@ -261,8 +265,10 @@ ExitCode JavaBinaryLauncher::Launch() {
// Check if CLASSPATH is over classpath length limit.
// If it does, then we create a classpath jar to pass CLASSPATH value.
string classpath_str = classpath.str();
+ string classpath_jar = "";
if (classpath_str.length() > this->classpath_limit) {
- arguments.push_back(CreateClasspathJar(classpath_str));
+ classpath_jar = CreateClasspathJar(classpath_str);
+ arguments.push_back(classpath_jar);
} else {
arguments.push_back(classpath_str);
}
@@ -290,7 +296,14 @@ ExitCode JavaBinaryLauncher::Launch() {
arguments.push_back(arg);
}
- return this->LaunchProcess(java_bin, arguments);
+ ExitCode exit_code = this->LaunchProcess(java_bin, arguments);
+
+ // Delete classpath jar file after execution.
+ if (!classpath_jar.empty()) {
+ DeleteFileByPath(classpath_jar.c_str());
+ }
+
+ return exit_code;
}
} // namespace launcher