Skip to content

Commit 4a744df

Browse files
Support java 9 (microsoft#90)
* support java 9 Signed-off-by: Jinbo Wang <jinbwan@microsoft.com> * refactor code Signed-off-by: Jinbo Wang <jinbwan@microsoft.com> * format code Signed-off-by: Jinbo Wang <jinbwan@microsoft.com> * Fix review comments Signed-off-by: Jinbo Wang <jinbwan@microsoft.com>
1 parent 40b6325 commit 4a744df

File tree

10 files changed

+268
-124
lines changed

10 files changed

+268
-124
lines changed

com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/DebugUtility.java

Lines changed: 69 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,39 @@
4040
import com.sun.jdi.request.StepRequest;
4141

4242
public class DebugUtility {
43+
public static final String HOME = "home";
44+
public static final String OPTIONS = "options";
45+
public static final String MAIN = "main";
46+
public static final String SUSPEND = "suspend";
47+
public static final String QUOTE = "quote";
48+
public static final String EXEC = "vmexec";
49+
public static final String CWD = "cwd";
50+
public static final String ENV = "env";
51+
public static final String HOSTNAME = "hostname";
52+
public static final String PORT = "port";
53+
public static final String TIMEOUT = "timeout";
4354

44-
public static IDebugSession launch(VirtualMachineManager vmManager, String mainClass, String programArguments, String vmArguments, List<String> classPaths,
45-
String cwd, String[] envVars) throws IOException, IllegalConnectorArgumentsException, VMStartException {
46-
return DebugUtility.launch(vmManager, mainClass, programArguments, vmArguments, String.join(File.pathSeparator, classPaths), cwd, envVars);
55+
/**
56+
* Launch a debuggee in suspend mode.
57+
* @see {@link #launch(VirtualMachineManager, String, String, String, String, String)}
58+
*/
59+
public static IDebugSession launch(VirtualMachineManager vmManager,
60+
String mainClass,
61+
String programArguments,
62+
String vmArguments,
63+
List<String> modulePaths,
64+
List<String> classPaths,
65+
String cwd,
66+
String[] envVars)
67+
throws IOException, IllegalConnectorArgumentsException, VMStartException {
68+
return DebugUtility.launch(vmManager,
69+
mainClass,
70+
programArguments,
71+
vmArguments,
72+
String.join(File.pathSeparator, modulePaths),
73+
String.join(File.pathSeparator, classPaths),
74+
cwd,
75+
envVars);
4776
}
4877

4978
/**
@@ -57,6 +86,8 @@ public static IDebugSession launch(VirtualMachineManager vmManager, String mainC
5786
* the program arguments.
5887
* @param vmArguments
5988
* the vm arguments.
89+
* @param modulePaths
90+
* the module paths.
6091
* @param classPaths
6192
* the class paths.
6293
* @param cwd
@@ -73,30 +104,49 @@ public static IDebugSession launch(VirtualMachineManager vmManager, String mainC
73104
* when the debuggee was successfully launched, but terminated
74105
* with an error before a connection could be established.
75106
*/
76-
public static IDebugSession launch(VirtualMachineManager vmManager, String mainClass, String programArguments, String vmArguments, String classPaths,
77-
String cwd, String[] envVars) throws IOException, IllegalConnectorArgumentsException, VMStartException {
107+
public static IDebugSession launch(VirtualMachineManager vmManager,
108+
String mainClass,
109+
String programArguments,
110+
String vmArguments,
111+
String modulePaths,
112+
String classPaths,
113+
String cwd,
114+
String[] envVars)
115+
throws IOException, IllegalConnectorArgumentsException, VMStartException {
78116
List<LaunchingConnector> connectors = vmManager.launchingConnectors();
79117
LaunchingConnector connector = connectors.get(0);
80118

81119
Map<String, Argument> arguments = connector.defaultArguments();
82-
arguments.get("suspend").setValue("true");
120+
arguments.get(SUSPEND).setValue("true");
121+
122+
String options = "";
83123
if (StringUtils.isNotBlank(vmArguments)) {
84-
arguments.get("options").setValue(vmArguments + " -cp \"" + classPaths + "\"");
85-
} else {
86-
arguments.get("options").setValue("-cp \"" + classPaths + "\"");
124+
options = vmArguments;
125+
}
126+
if (StringUtils.isNotBlank(modulePaths)) {
127+
options += " --module-path \"" + modulePaths + "\"";
128+
}
129+
if (StringUtils.isNotBlank(classPaths)) {
130+
options += " -cp \"" + classPaths + "\"";
131+
}
132+
arguments.get(OPTIONS).setValue(options);
133+
134+
// For java 9 project, should specify "-m $MainClass".
135+
String[] mainClasses = mainClass.split("/");
136+
if (StringUtils.isNotBlank(modulePaths) || mainClasses.length == 2) {
137+
mainClass = "-m " + mainClass;
87138
}
88139
if (StringUtils.isNotBlank(programArguments)) {
89-
arguments.get("main").setValue(mainClass + " " + programArguments);
90-
} else {
91-
arguments.get("main").setValue(mainClass);
140+
mainClass += " " + programArguments;
92141
}
142+
arguments.get(MAIN).setValue(mainClass);
93143

94-
if (arguments.get("cwd") != null) {
95-
arguments.get("cwd").setValue(cwd);
144+
if (arguments.get(CWD) != null) {
145+
arguments.get(CWD).setValue(cwd);
96146
}
97147

98-
if (arguments.get("env") != null) {
99-
arguments.get("env").setValue(encodeArrayArgument(envVars));
148+
if (arguments.get(ENV) != null) {
149+
arguments.get(ENV).setValue(encodeArrayArgument(envVars));
100150
}
101151

102152
VirtualMachine vm = connector.launch(arguments);
@@ -131,9 +181,9 @@ public static IDebugSession attach(VirtualMachineManager vmManager, String hostN
131181
List<AttachingConnector> connectors = vmManager.attachingConnectors();
132182
AttachingConnector connector = connectors.get(0);
133183
Map<String, Argument> arguments = connector.defaultArguments();
134-
arguments.get("hostname").setValue(hostName);
135-
arguments.get("port").setValue(String.valueOf(port));
136-
arguments.get("timeout").setValue(String.valueOf(attachTimeout));
184+
arguments.get(HOSTNAME).setValue(hostName);
185+
arguments.get(PORT).setValue(String.valueOf(port));
186+
arguments.get(TIMEOUT).setValue(String.valueOf(attachTimeout));
137187
return new DebugSession(connector.attach(arguments));
138188
}
139189

com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/LaunchRequestHandler.java

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.Map.Entry;
2424
import java.util.logging.Logger;
2525

26+
import org.apache.commons.lang3.ArrayUtils;
2627
import org.apache.commons.lang3.StringUtils;
2728

2829
import com.microsoft.java.debug.core.Configuration;
@@ -55,10 +56,10 @@ public List<Command> getTargetCommands() {
5556
@Override
5657
public void handle(Command command, Arguments arguments, Response response, IDebugAdapterContext context) {
5758
LaunchArguments launchArguments = (LaunchArguments) arguments;
58-
if (StringUtils.isBlank(launchArguments.mainClass) || launchArguments.classPaths == null
59-
|| launchArguments.classPaths.length == 0) {
59+
if (StringUtils.isBlank(launchArguments.mainClass)
60+
|| (ArrayUtils.isEmpty(launchArguments.modulePaths) && ArrayUtils.isEmpty(launchArguments.classPaths))) {
6061
AdapterUtils.setErrorResponse(response, ErrorCode.ARGUMENT_MISSING,
61-
String.format("Failed to launch debuggee VM. Missing mainClass or classPath options in launch configuration"));
62+
String.format("Failed to launch debuggee VM. Missing mainClass or modulePaths/classPaths options in launch configuration"));
6263
return;
6364
}
6465

@@ -70,7 +71,7 @@ public void handle(Command command, Arguments arguments, Response response, IDeb
7071
} else {
7172
if (!Charset.isSupported(launchArguments.encoding)) {
7273
AdapterUtils.setErrorResponse(response, ErrorCode.INVALID_ENCODING,
73-
String.format("Failed to launch debuggee VM. 'encoding' options in launch configuration is not recognized."));
74+
String.format("Failed to launch debuggee VM. 'encoding' options in the launch configuration is not recognized."));
7475
return;
7576
}
7677

@@ -114,11 +115,26 @@ public void handle(Command command, Arguments arguments, Response response, IDeb
114115
}
115116

116117
try {
117-
logger.info(String.format("Trying to launch Java Program with options \"%s -cp %s %s %s\" .",
118-
launchArguments.vmArgs, StringUtils.join(launchArguments.classPaths, File.pathSeparator), launchArguments.mainClass, launchArguments.args));
119-
IDebugSession debugSession = DebugUtility.launch(vmProvider.getVirtualMachineManager(), launchArguments.mainClass, launchArguments.args,
120-
launchArguments.vmArgs, Arrays.asList(launchArguments.classPaths), launchArguments.cwd, envVars);
118+
StringBuilder launchLogs = new StringBuilder();
119+
launchLogs.append("Trying to launch Java Program with options:\n");
120+
launchLogs.append(String.format("main-class: %s\n", launchArguments.mainClass));
121+
launchLogs.append(String.format("args: %s\n", launchArguments.args));
122+
launchLogs.append(String.format("module-path: %s\n", StringUtils.join(launchArguments.modulePaths, File.pathSeparator)));
123+
launchLogs.append(String.format("class-path: %s\n", StringUtils.join(launchArguments.classPaths, File.pathSeparator)));
124+
launchLogs.append(String.format("vmArgs: %s", launchArguments.vmArgs));
125+
logger.info(launchLogs.toString());
126+
127+
IDebugSession debugSession = DebugUtility.launch(
128+
vmProvider.getVirtualMachineManager(),
129+
launchArguments.mainClass,
130+
launchArguments.args,
131+
launchArguments.vmArgs,
132+
Arrays.asList(launchArguments.modulePaths),
133+
Arrays.asList(launchArguments.classPaths),
134+
launchArguments.cwd,
135+
envVars);
121136
context.setDebugSession(debugSession);
137+
122138
logger.info("Launching debuggee VM succeeded.");
123139

124140
ProcessConsole debuggeeConsole = new ProcessConsole(debugSession.process(), "Debuggee", context.getDebuggeeEncoding());
@@ -145,4 +161,5 @@ public void handle(Command command, Arguments arguments, Response response, IDeb
145161
}
146162
sourceProvider.initialize(context.getDebugSession(), options);
147163
}
164+
148165
}

com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/protocol/Requests.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public static class LaunchArguments extends Arguments {
4848
public String vmArgs = "";
4949
public String encoding = "";
5050
public String[] classPaths = new String[0];
51+
public String[] modulePaths = new String[0];
5152
public String[] sourcePaths = new String[0];
5253
public String cwd;
5354
public Map<String, String> env;

com.microsoft.java.debug.core/src/test/java/com/microsoft/java/debug/core/DebugSessionFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public static IDebugSession getDebugSession(String projectName, String mainClass
5252
String projectRoot = new File(rootPath, name).getAbsolutePath();
5353
try {
5454
final IDebugSession debugSession = DebugUtility.launch(Bootstrap.virtualMachineManager(), mainClass, "", "",
55-
new File(projectRoot, "bin").getAbsolutePath(), null, null);
55+
null, new File(projectRoot, "bin").getAbsolutePath(), null, null);
5656
debugSession.getEventHub().events().subscribe(debugEvent -> {
5757
if (debugEvent.event instanceof VMDisconnectEvent) {
5858
try {

com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/AdvancedLaunchingConnector.java

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,6 @@
3535
*
3636
*/
3737
public class AdvancedLaunchingConnector extends SocketLaunchingConnectorImpl implements LaunchingConnector {
38-
public static final String HOME = "home";
39-
public static final String OPTIONS = "options";
40-
public static final String MAIN = "main";
41-
public static final String SUSPEND = "suspend";
42-
public static final String QUOTE = "quote";
43-
public static final String EXEC = "vmexec";
44-
private static final String CWD = "cwd";
45-
private static final String ENV = "env";
4638
private static final int ACCEPT_TIMEOUT = 10 * 1000;
4739

4840
public AdvancedLaunchingConnector(VirtualMachineManagerImpl virtualMachineManager) {
@@ -53,13 +45,13 @@ public AdvancedLaunchingConnector(VirtualMachineManagerImpl virtualMachineManage
5345
public Map<String, Argument> defaultArguments() {
5446
Map<String, Argument> defaultArgs = super.defaultArguments();
5547

56-
Argument cwdArg = new AdvancedStringArgumentImpl(CWD, "Current working directory", CWD, false);
48+
Argument cwdArg = new AdvancedStringArgumentImpl(DebugUtility.CWD, "Current working directory", DebugUtility.CWD, false);
5749
cwdArg.setValue(null);
58-
defaultArgs.put(CWD, cwdArg);
50+
defaultArgs.put(DebugUtility.CWD, cwdArg);
5951

60-
Argument envArg = new AdvancedStringArgumentImpl(ENV, "Environment variables", ENV, false);
52+
Argument envArg = new AdvancedStringArgumentImpl(DebugUtility.ENV, "Environment variables", DebugUtility.ENV, false);
6153
envArg.setValue(null);
62-
defaultArgs.put(ENV, envArg);
54+
defaultArgs.put(DebugUtility.ENV, envArg);
6355

6456
return defaultArgs;
6557
}
@@ -72,15 +64,15 @@ public String name() {
7264
@Override
7365
public VirtualMachine launch(Map<String, ? extends Argument> connectionArgs)
7466
throws IOException, IllegalConnectorArgumentsException, VMStartException {
75-
String cwd = connectionArgs.get(CWD).value();
67+
String cwd = connectionArgs.get(DebugUtility.CWD).value();
7668
File workingDir = null;
7769
if (cwd != null && Files.isDirectory(Paths.get(cwd))) {
7870
workingDir = new File(cwd);
7971
}
8072

8173
String[] envVars = null;
8274
try {
83-
envVars = DebugUtility.decodeArrayArgument(connectionArgs.get(ENV).value());
75+
envVars = DebugUtility.decodeArrayArgument(connectionArgs.get(DebugUtility.ENV).value());
8476
} catch (IllegalArgumentException e) {
8577
// do nothing.
8678
}
@@ -107,12 +99,12 @@ public VirtualMachine launch(Map<String, ? extends Argument> connectionArgs)
10799
}
108100

109101
private static String[] constructLaunchCommand(Map<String, ? extends Argument> launchingOptions, String address) {
110-
final String javaHome = launchingOptions.get(HOME).value();
111-
final String javaExec = launchingOptions.get(EXEC).value();
102+
final String javaHome = launchingOptions.get(DebugUtility.HOME).value();
103+
final String javaExec = launchingOptions.get(DebugUtility.EXEC).value();
112104
final String slash = System.getProperty("file.separator");
113-
boolean suspend = Boolean.valueOf(launchingOptions.get(SUSPEND).value());
114-
final String javaOptions = launchingOptions.get(OPTIONS).value();
115-
final String main = launchingOptions.get(MAIN).value();
105+
boolean suspend = Boolean.valueOf(launchingOptions.get(DebugUtility.SUSPEND).value());
106+
final String javaOptions = launchingOptions.get(DebugUtility.OPTIONS).value();
107+
final String main = launchingOptions.get(DebugUtility.MAIN).value();
116108

117109
StringBuilder execString = new StringBuilder();
118110
execString.append("\"" + javaHome + slash + "bin" + slash + javaExec + "\"");

com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/JavaDebugDelegateCommandHandler.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ public class JavaDebugDelegateCommandHandler implements IDelegateCommandHandler
3232

3333
public static String CONFIG_LOG_LEVEL = "vscode.java.configLogLevel";
3434

35-
3635
@Override
3736
public Object executeCommand(String commandId, List<Object> arguments, IProgressMonitor progress) throws Exception {
3837
if (DEBUG_STARTSESSION.equals(commandId)) {

0 commit comments

Comments
 (0)