Accommodate JDK17
The signatures of com.sun.tools.javac.main.CommandLine.parse and
com.sun.tools.javac.main.Arguments.init methods changed between JDK14
and JDK17, call these methods via reflection to accomodadte both.
Bug: 240421813
Test: build java extractor and use it
Change-Id: I5db0a22bf9f837826f234e228f9652d422d94f20
diff --git a/kythe/java/com/google/devtools/kythe/extractors/java/standalone/AbstractJavacWrapper.java b/kythe/java/com/google/devtools/kythe/extractors/java/standalone/AbstractJavacWrapper.java
index 189ebe9..0c883ac 100644
--- a/kythe/java/com/google/devtools/kythe/extractors/java/standalone/AbstractJavacWrapper.java
+++ b/kythe/java/com/google/devtools/kythe/extractors/java/standalone/AbstractJavacWrapper.java
@@ -34,6 +34,8 @@
import com.sun.tools.javac.main.CommandLine;
import java.io.File;
import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -148,7 +150,26 @@
private static String[] getCleanedUpArguments(String[] args) throws IOException {
// Expand all @file arguments
- List<String> expandedArgs = Lists.newArrayList(CommandLine.parse(args));
+ // JDK changed the signature of the CommandLine.parse method in JDK15,
+ // support both versions
+ List<String> expandedArgs = null;
+ try {
+ try {
+ // JDK15+: the signature is
+ // List<String> parse(List<String> args);
+ expandedArgs = (List<String>)CommandLine.class.getMethod("parse", List.class).invoke(null, (Object)Arrays.asList(args));
+ } catch (NoSuchMethodException nsme) {
+ // pre-JDK15:
+ // String[] parse(String[]);
+ expandedArgs = Arrays.asList((String[])CommandLine.class.getMethod("parse", String[].class).invoke(null, (Object)args));
+ }
+ } catch (NoSuchMethodException ns2) {
+ System.err.printf("Cannot locate com.sun.tools.javac.main.CommandLine.parse method, JDK version %s\n", System.getProperty("java.version"));
+ System.exit(2);
+ } catch (InvocationTargetException|IllegalAccessException ex) {
+ System.err.printf("Cannot call com.sun.tools.javac.main.CommandLine.parse (JDK version %s):\n%s\n", System.getProperty("java.version"), ex);
+ System.exit(2);
+ }
// We skip some arguments that would normally be passed to javac:
// -J, these are flags to the java environment running javac.
diff --git a/kythe/java/com/google/devtools/kythe/extractors/java/standalone/Javac9Wrapper.java b/kythe/java/com/google/devtools/kythe/extractors/java/standalone/Javac9Wrapper.java
index 1394f4e..31bc66a 100644
--- a/kythe/java/com/google/devtools/kythe/extractors/java/standalone/Javac9Wrapper.java
+++ b/kythe/java/com/google/devtools/kythe/extractors/java/standalone/Javac9Wrapper.java
@@ -28,6 +28,8 @@
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.Options;
import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collection;
import java.util.EnumSet;
@@ -46,7 +48,27 @@
JavacFileManager fileManager = new JavacFileManager(context, true, null);
Arguments args = Arguments.instance(context);
- args.init("kythe_javac", arguments);
+ // JDK changed the signature of Arguments.init method, support both
+ try {
+ try {
+ // JDK15+: the signature is
+ // init(String, Iterable<String> args);
+ Arguments.class.getMethod("init", String.class, Iterable.class)
+ .invoke(args, "kythe_javac", (Object) Arrays.asList(arguments));
+ } catch (NoSuchMethodException nsme) {
+ // pre-JDK15:
+ // init(String, String...);
+ Arguments.class.getMethod("init", String.class,String[].class)
+ .invoke(args, "kythe_javac", (Object)arguments);
+ }
+ } catch (NoSuchMethodException ns2) {
+ System.err.printf("Cannot locate com.sun.tools.javac.main.Arguments.init method, JDK version %s\n", System.getProperty("java.version"));
+ System.exit(2);
+ } catch (InvocationTargetException|IllegalAccessException ex) {
+ System.err.printf("Cannot call com.sun.tools.javac.main.Arguments.init (JDK version %s):\n%s\n", System.getProperty("java.version"), ex);
+ System.exit(2);
+ }
+
fileManager.handleOptions(args.getDeferredFileManagerOptions());
Options options = Options.instance(context);