aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/java_tools/buildjar
diff options
context:
space:
mode:
authorGravatar Philipp Wollermann <philwo@google.com>2015-06-09 12:47:32 +0000
committerGravatar Philipp Wollermann <philwo@google.com>2015-06-10 16:02:08 +0000
commitb7ce7a84484e877fab21e5e5f2fc1befb55a5384 (patch)
tree3fc6af5420f25a697f2accf91a6f72f74a81a797 /src/java_tools/buildjar
parent6c5688d121cba9e68259be13a0ce39dc4f026f9a (diff)
JavaBuilder can run as a Blaze worker process now.
-- MOS_MIGRATED_REVID=95527889
Diffstat (limited to 'src/java_tools/buildjar')
-rw-r--r--src/java_tools/buildjar/BUILD6
-rw-r--r--src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BazelJavaBuilder.java93
2 files changed, 89 insertions, 10 deletions
diff --git a/src/java_tools/buildjar/BUILD b/src/java_tools/buildjar/BUILD
index eabf9d53b1..5e41759ba1 100644
--- a/src/java_tools/buildjar/BUILD
+++ b/src/java_tools/buildjar/BUILD
@@ -6,6 +6,7 @@ java_binary(
main_class = "com.google.devtools.build.buildjar.BazelJavaBuilder",
deps = [
"//src/main/protobuf:proto_deps",
+ "//src/main/protobuf:proto_worker_protocol",
"//third_party:error_prone",
"//third_party:guava",
"//third_party:jsr305",
@@ -176,7 +177,10 @@ bootstrap_java_library(
"//third_party:protobuf-jars",
],
neverlink_jars = ["//tools/defaults:java_langtools"],
- srcjars = ["//src/main/protobuf:proto_deps_srcjar"],
+ srcjars = [
+ "//src/main/protobuf:proto_deps_srcjar",
+ "//src/main/protobuf:proto_worker_protocol_srcjar",
+ ],
)
bootstrap_java_binary(
diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BazelJavaBuilder.java b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BazelJavaBuilder.java
index 4531098a77..0ba15cd4fd 100644
--- a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BazelJavaBuilder.java
+++ b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BazelJavaBuilder.java
@@ -20,9 +20,14 @@ import com.google.devtools.build.buildjar.javac.plugins.BlazeJavaCompilerPlugin;
import com.google.devtools.build.buildjar.javac.plugins.dependency.DependencyModule;
import com.google.devtools.build.buildjar.javac.plugins.errorprone.ErrorProneOptionsPlugin;
import com.google.devtools.build.buildjar.javac.plugins.filemanager.FileManagerInitializationPlugin;
+import com.google.devtools.build.lib.worker.WorkerProtocol.WorkRequest;
+import com.google.devtools.build.lib.worker.WorkerProtocol.WorkResponse;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.io.PrintStream;
import java.util.Arrays;
+import java.util.List;
/**
* The JavaBuilder main called by bazel.
@@ -35,22 +40,92 @@ public abstract class BazelJavaBuilder {
* The main method of the BazelJavaBuilder.
*/
public static void main(String[] args) {
+ if (args.length == 1 && args[0].equals("--persistent_worker")) {
+ System.exit(runPersistentWorker());
+ } else {
+ // This is a single invocation of JavaBuilder that exits after it processed the request.
+ System.exit(processRequest(Arrays.asList(args)));
+ }
+ }
+
+ private static int runPersistentWorker() {
+ PrintStream originalStdOut = System.out;
+ PrintStream originalStdErr = System.err;
+
+ while (true) {
+ try {
+ WorkRequest request = WorkRequest.parseDelimitedFrom(System.in);
+
+ if (request == null) {
+ break;
+ }
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ PrintStream ps = new PrintStream(baos, true);
+ // Make sure that we exit nonzero in case an exception occurs during processRequest.
+ int exitCode = 1;
+ // TODO(philwo) - change this so that a PrintWriter can be passed in and will be used
+ // instead of redirect stdout / stderr.
+ System.setOut(ps);
+ System.setErr(ps);
+ try {
+ exitCode = processRequest(request.getArgumentsList());
+ } finally {
+ System.setOut(originalStdOut);
+ System.setErr(originalStdErr);
+ }
+
+ WorkResponse.newBuilder()
+ .setOutput(baos.toString())
+ .setExitCode(exitCode)
+ .build()
+ .writeDelimitedTo(System.out);
+ System.out.flush();
+ } catch (IOException e) {
+ e.printStackTrace();
+ return 1;
+ } finally {
+ // JavaBuilder doesn't close certain file handles. We have to migrate to using the real
+ // Jsr199 API instead of just calling the Main method of Javac in order to fix this, for
+ // now let's just invoke GC.
+ System.gc();
+ }
+ }
+
+ return 0;
+ }
+
+ private static int processRequest(List<String> args) {
try {
- ImmutableList<BlazeJavaCompilerPlugin> plugins =
- ImmutableList.<BlazeJavaCompilerPlugin>of(
- new FileManagerInitializationPlugin(),
- new ErrorProneOptionsPlugin());
- JavaLibraryBuildRequest build =
- new JavaLibraryBuildRequest(
- Arrays.asList(args), plugins, new DependencyModule.Builder());
- build.setJavacOpts(JavacOptions.normalizeOptions(build.getJavacOpts()));
+ JavaLibraryBuildRequest build = parse(args);
AbstractJavaBuilder builder = build.getDependencyModule().reduceClasspath()
? new ReducedClasspathJavaLibraryBuilder()
: new SimpleJavaLibraryBuilder();
builder.run(build, System.err);
} catch (IOException | InvalidCommandLineException e) {
System.err.println(CMDNAME + " threw exception : " + e.getMessage());
- System.exit(1);
+ return 1;
}
+ return 0;
+ }
+
+ /**
+ * Parses the list of arguments into a {@link JavaLibraryBuildRequest}. The returned
+ * {@link JavaLibraryBuildRequest} object can be then used to configure the compilation itself.
+ *
+ * @throws IOException if the argument list contains a file (with the @ prefix) and reading that
+ * file failed
+ * @throws InvalidCommandLineException on any command line error
+ */
+ private static JavaLibraryBuildRequest parse(List<String> args) throws IOException,
+ InvalidCommandLineException {
+ ImmutableList<BlazeJavaCompilerPlugin> plugins =
+ ImmutableList.<BlazeJavaCompilerPlugin>of(
+ new FileManagerInitializationPlugin(),
+ new ErrorProneOptionsPlugin());
+ JavaLibraryBuildRequest build =
+ new JavaLibraryBuildRequest(args, plugins, new DependencyModule.Builder());
+ build.setJavacOpts(JavacOptions.normalizeOptions(build.getJavacOpts()));
+ return build;
}
}