when does this happen? If `path` itself was empty.
Shall I move this check above the conversion? Yes please. Done.
Windows, java_binary: MakeDirectoriesW fail in launcher
### Description of the problem / feature request:

If you copy a java_binary's outputs somewhere out of bazel-bin and try to run it from the current working directory, the launcher will fail with a MakeDirectoriesW error.

BUILD:
```
java_binary(
  name = "foo",
  srcs = ["Main.java"],
  main_class = "Main",
)
```

Main.java
```
public class Main {
  public static void main(String[] args) {
    System.out.println("helloworld");
  }
}
```

Then copy `bazel-bin\foo.exe`, `bazel-bin\foo.exe.runfiles_manifest`, and `bazel-bin\foo.jar` into `c:\tmp1\launcher_test`, and run foo.exe:

```
C:\tmp1\launcher_test>foo.exe --classpath_limit=0  --print_launcher_command
FATAL: MakeDirectoriesW(foo.exe.j) could not find dirname: (error: 2): The system cannot find the file specified.
```

### What operating system are you running Bazel on?

Windows 10

### What's the output of `bazel info release`?

0.22.0
src/main/cpp/util/file_windows.cc
src/main/cpp/util/file_windows.cc
diff --git a/src/main/cpp/util/file_windows.cc b/src/main/cpp/util/file_windows.cc
index cc2225ed37ae72..a71db514216aca 100644
--- a/src/main/cpp/util/file_windows.cc
+++ b/src/main/cpp/util/file_windows.cc
@@ -755,22 +755,28 @@ void SyncFile(const string& path) {
 }
 
 bool MakeDirectoriesW(const wstring& path, unsigned int mode) {
-  if (path.empty()) {
+  std::wstring abs_path;
+  std::string error;
+  if (abs_path.empty()) {
     return false;
   }
-  if (IsRootDirectoryW(path) || IsDirectoryW(path)) {
+  if (!AsAbsoluteWindowsPath(path, &abs_path, &error)) {
+    BAZEL_DIE(blaze_exit_code::LOCAL_ENVIRONMENTAL_ERROR) << "MakeDirectoriesW("
+        << blaze_util::WstringToString(path) << "): " << error;
+  }
+  if (IsRootDirectoryW(abs_path) || IsDirectoryW(abs_path)) {
     return true;
   }
-  wstring parent = SplitPathW(path).first;
+  wstring parent = SplitPathW(abs_path).first;
   if (parent.empty()) {
-    // Since `path` is not a root directory, there should have been at least one
-    // directory above it.
+    // Since `abs_path` is not a root directory, there should have been at least
+    // one directory above it.
     BAZEL_DIE(blaze_exit_code::LOCAL_ENVIRONMENTAL_ERROR)
-        << "MakeDirectoriesW(" << blaze_util::WstringToString(path)
+        << "MakeDirectoriesW(" << blaze_util::WstringToString(abs_path)
         << ") could not find dirname: " << GetLastErrorString();
   }
   return MakeDirectoriesW(parent, mode) &&
-         ::CreateDirectoryW(path.c_str(), NULL) == TRUE;
+         ::CreateDirectoryW(abs_path.c_str(), NULL) == TRUE;
 }
 
 bool MakeDirectories(const string& path, unsigned int mode) {
