diff --git a/scripts/win.bat b/scripts/win.bat
new file mode 100644
index 0000000..6dcefd2
--- /dev/null
+++ b/scripts/win.bat
@@ -0,0 +1,18 @@
+:: script for developing with virtualbox. Rsyncs files using Robocopy and then runs any builds/tests.
+SET REAL_SRC="z:\github.com\bazelbuild\rules_kotlin"
+
+pushd %~dp0
+    SET TARGET_DIR=%CD%\..
+popd
+
+robocopy %REAL_SRC% %TARGET_DIR% /mir /xo /xd bazel-* /NFL /NDL
+
+ bazel ^
+    --output_base "c:\tmp\bazel" ^
+    --output_user_root "c:\tmp\bazel_rules_kotlin" ^
+    build //src/main/kotlin:builder
+
+ bazel ^
+    --output_base "c:\tmp\bazel" ^
+    --output_user_root "c:\tmp\bazel_rules_kotlin" ^
+    test -- //src/test/kotlin/io/bazel/kotlin/builder:builder_tests
diff --git a/src/main/kotlin/bootstrap.bzl b/src/main/kotlin/bootstrap.bzl
index 5901cda..2668fc0 100644
--- a/src/main/kotlin/bootstrap.bzl
+++ b/src/main/kotlin/bootstrap.bzl
@@ -47,32 +47,47 @@
         visibility = ["//visibility:private"],
     )
     command = """
-KOTLIN_HOME=external/com_github_jetbrains_kotlin
-
 function join_by { local IFS="$$1"; shift; echo "$$*"; }
-
+case "$$(uname -s)" in
+    CYGWIN*|MINGW32*|MSYS*)
+        SEP=";"
+        ;;
+    *)
+        SEP=":"
+        ;;
+esac
 NAME=%s
-CP="$$(join_by : $(locations :%s))"
+CP="$$(join_by $$SEP $(locations :%s))"
 ARGS="%s"
 
-java -Xmx256M -Xms32M -noverify \
-  -cp $${KOTLIN_HOME}/lib/kotlin-preloader.jar org.jetbrains.kotlin.preloading.Preloader \
-  -cp $${KOTLIN_HOME}/lib/kotlin-compiler.jar org.jetbrains.kotlin.cli.jvm.K2JVMCompiler \
-  -cp $${CP} -d $${NAME}_temp.jar $${ARGS} $(SRCS)
+$(JAVA) -Xmx256M -Xms32M -noverify \
+  -cp $(location @com_github_jetbrains_kotlin//:kotlin-preloader) org.jetbrains.kotlin.preloading.Preloader \
+  -cp $(location @com_github_jetbrains_kotlin//:kotlin-compiler) org.jetbrains.kotlin.cli.jvm.K2JVMCompiler \
+  -cp $${CP} -d $(@D)/$${NAME}_temp.jar $${ARGS} $(SRCS)
 
-$(location @bazel_tools//tools/jdk:singlejar) \
+case "$(location @bazel_tools//tools/jdk:singlejar)" in
+    *.jar)
+        SJ="$(JAVA) -jar $(location @bazel_tools//tools/jdk:singlejar)"
+        ;;
+    *)
+        SJ="$(location @bazel_tools//tools/jdk:singlejar)"
+        ;;
+esac
+
+$$SJ \
     --normalize \
     --compression \
-    --sources $${NAME}_temp.jar \
+    --sources $(@D)/$${NAME}_temp.jar \
     --output $(OUTS)
 
-rm $${NAME}_temp.jar
+rm $(@D)/$${NAME}_temp.jar
 """ % (name, dep_label, " ".join(_BOOTSTRAP_LIB_ARGS))
     native.genrule(
         name = jar_label,
         tools = [
             "@com_github_jetbrains_kotlin//:home",
-            "@local_jdk//:jdk",
+            "@com_github_jetbrains_kotlin//:kotlin-preloader",
+            "@com_github_jetbrains_kotlin//:kotlin-compiler",
             "@bazel_tools//tools/jdk:singlejar",
             dep_label,
         ],
@@ -80,6 +95,9 @@
         outs = [name + ".jar"],
         tags = ["no-ide"],
         visibility = ["//visibility:private"],
+        toolchains = [
+            "@bazel_tools//tools/jdk:current_host_java_runtime",
+        ],
         cmd = command,
     )
     native.java_import(
diff --git a/src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/JDepsGenerator.kt b/src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/JDepsGenerator.kt
index 83cc7e8..181fe8f 100644
--- a/src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/JDepsGenerator.kt
+++ b/src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/JDepsGenerator.kt
@@ -66,7 +66,7 @@
                                 JdepsParser.parse(
                                     command.info.label,
                                     command.outputs.jdeps,
-                                    joinedClasspath,
+                                    command.inputs.classpathList,
                                     it,
                                     isKotlinImplicit
                                 )
diff --git a/src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/JavaCompiler.kt b/src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/JavaCompiler.kt
index c7385bb..606f644 100644
--- a/src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/JavaCompiler.kt
+++ b/src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/JavaCompiler.kt
@@ -20,6 +20,7 @@
 import io.bazel.kotlin.builder.utils.addAll
 import io.bazel.kotlin.builder.utils.joinedClasspath
 import io.bazel.kotlin.model.JvmCompilationTask
+import java.io.File
 import java.io.PrintWriter
 import javax.inject.Inject
 import javax.inject.Singleton
@@ -28,12 +29,18 @@
 internal class JavaCompiler @Inject constructor(
     private val javacInvoker: KotlinToolchain.JavacInvoker
 ) {
+    companion object {
+        /**
+         * Separator for a directory in the classpath.
+         */
+        private val DIR_SEP = "${File.separatorChar}${File.pathSeparator}"
+    }
     fun compile(context: CompilationTaskContext, command: JvmCompilationTask) {
         val i = command.inputs
         val d = command.directories
         if (i.javaSourcesList.isNotEmpty()) {
             val args = mutableListOf(
-                "-cp", "${d.classes}/:${d.temp}/:${i.joinedClasspath}",
+                "-cp", "${d.classes}$DIR_SEP${d.temp}$DIR_SEP${i.joinedClasspath}",
                 "-d", d.classes
             ).also {
                 it.addAll(
diff --git a/src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/JdepsParser.kt b/src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/JdepsParser.kt
index 0c923e6..c2c053e 100644
--- a/src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/JdepsParser.kt
+++ b/src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/JdepsParser.kt
@@ -113,15 +113,14 @@
         fun parse(
             label: String,
             classJar: String,
-            classPath: String,
-            jdepLines: List<String>,
+            classPath: MutableList<String>,
+            lines: List<String>,
             isImplicit: Predicate<String>
         ): Deps.Dependencies {
             val filename = Paths.get(classJar).fileName.toString()
             val jdepsParser = JdepsParser(filename, isImplicit)
-            classPath.split(":".toRegex()).dropLastWhile { it.isEmpty() }.stream()
-                .forEach { x -> jdepsParser.consumeJarLine(x, Deps.Dependency.Kind.UNUSED) }
-            jdepLines.forEach { jdepsParser.processLine(it) }
+            classPath.forEach { x -> jdepsParser.consumeJarLine(x, Deps.Dependency.Kind.UNUSED) }
+            lines.forEach { jdepsParser.processLine(it) }
 
             val rootBuilder = Deps.Dependencies.newBuilder()
             rootBuilder.success = false
diff --git a/src/main/kotlin/io/bazel/kotlin/builder/toolchain/KotlinToolchain.kt b/src/main/kotlin/io/bazel/kotlin/builder/toolchain/KotlinToolchain.kt
index 167ba0f..5fbf9e7 100644
--- a/src/main/kotlin/io/bazel/kotlin/builder/toolchain/KotlinToolchain.kt
+++ b/src/main/kotlin/io/bazel/kotlin/builder/toolchain/KotlinToolchain.kt
@@ -15,6 +15,7 @@
  */
 package io.bazel.kotlin.builder.toolchain
 
+import io.bazel.kotlin.builder.utils.BazelRunFiles
 import io.bazel.kotlin.builder.utils.resolveVerified
 import org.jetbrains.kotlin.preloading.ClassPreloadingUtils
 import org.jetbrains.kotlin.preloading.Preloader
@@ -45,31 +46,38 @@
         internal val NO_ARGS = arrayOf<Any>()
 
         private val isJdk9OrNewer = !System.getProperty("java.version").startsWith("1.")
-        private val javaRunfiles get() = Paths.get(System.getenv("JAVA_RUNFILES"))
 
-        private fun createClassLoader(javaHome: Path, kotlinHome: Path): ClassLoader {
-            val preloadJars = mutableListOf<File>().also {
-                it += kotlinHome.resolveVerified("lib", "kotlin-compiler.jar")
-                it += javaRunfiles.resolveVerified("io_bazel_rules_kotlin", "src", "main", "kotlin", "compiler_lib.jar")
-                if (!isJdk9OrNewer) {
-                    it += javaHome.resolveVerified("lib", "tools.jar")
-                }
-            }
-            return ClassPreloadingUtils.preloadClasses(
-                preloadJars,
+        private fun createClassLoader(javaHome: Path, baseJars: List<File>): ClassLoader =
+            ClassPreloadingUtils.preloadClasses(
+                mutableListOf<File>().also {
+                    it += baseJars
+                    if (!isJdk9OrNewer) {
+                        it += javaHome.resolveVerified("lib", "tools.jar")
+                    }
+                },
                 Preloader.DEFAULT_CLASS_NUMBER_ESTIMATE,
                 ClassLoader.getSystemClassLoader(),
                 null
             )
-        }
 
         @JvmStatic
         fun createToolchain(): KotlinToolchain {
-            val kotlinHome = Paths.get("external", "com_github_jetbrains_kotlin")
             val javaHome = Paths.get(System.getProperty("java.home")).let { path ->
                 path.takeIf { !it.endsWith(Paths.get("jre")) } ?: path.parent
             }
-            return KotlinToolchain(kotlinHome, createClassLoader(javaHome, kotlinHome))
+            val kotlinCompilerJar = BazelRunFiles.resolveVerified(
+                "external", "com_github_jetbrains_kotlin", "lib", "kotlin-compiler.jar")
+            return KotlinToolchain(
+                kotlinCompilerJar.toPath().parent.parent,
+                createClassLoader(
+                    javaHome,
+                    listOf(
+                        kotlinCompilerJar,
+                        BazelRunFiles.resolveVerified(
+                            "io_bazel_rules_kotlin", "src", "main", "kotlin", "compiler_lib.jar")
+                    )
+                )
+            )
         }
     }
 
diff --git a/src/main/kotlin/io/bazel/kotlin/builder/utils/BazelUtils.kt b/src/main/kotlin/io/bazel/kotlin/builder/utils/BazelUtils.kt
new file mode 100644
index 0000000..311327e
--- /dev/null
+++ b/src/main/kotlin/io/bazel/kotlin/builder/utils/BazelUtils.kt
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2018 The Bazel Authors. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.bazel.kotlin.builder.utils
+
+import java.io.File
+import java.io.FileInputStream
+import java.nio.charset.Charset
+import java.nio.file.Paths
+import java.util.*
+
+/** Utility class for getting runfiles on windows and *nix.  */
+object BazelRunFiles {
+    private val isWindows = System.getProperty("os.name").toLowerCase().indexOf("win") >= 0
+    /**
+     * Populated on windows. The RUNFILES_MANIFEST_FILE is set on platforms other then windows but it can be empty,]
+     */
+    private val manifestFile: String? =
+        if (isWindows) {
+            checkNotNull(System.getenv("RUNFILES_MANIFEST_FILE")) { "RUNFILES_MANIFEST_FILE not set in environment" }
+        } else null
+
+    private val javaRunFiles = Paths.get(System.getenv("JAVA_RUNFILES"))
+
+    private val runfiles by lazy {
+        with(mutableMapOf<String, String>()) {
+            FileInputStream(manifestFile)
+                .bufferedReader(Charset.forName("UTF-8"))
+                .lines()
+                .forEach { it ->
+                    val line = it.trim { it <= ' ' }
+                    if (!line.isEmpty()) {
+                        // TODO(bazel-team): This is buggy when the path contains spaces, we should fix the manifest format.
+                        line.split(" ").also {
+                            check(it.size == 2) { "RunFiles manifest entry $line contains more than one space" }
+                            put(it[0], it[1])
+                        }
+                    }
+                }
+            Collections.unmodifiableMap(this)
+        }
+    }
+
+    /**
+     * Resolve a run file on windows or *nix.
+     */
+    @JvmStatic
+    fun resolveVerified(vararg path: String): File {
+        check(path.isNotEmpty())
+        val fromManifest = manifestFile?.let { mf ->
+            path.joinToString("/").let { rfPath ->
+                // trim off the external/ prefix if it is present.
+                val trimmedPath =
+                    if (rfPath.startsWith("external/")) {
+                        rfPath.replaceFirst("external/", "")
+                    } else {
+                        rfPath
+                    }
+                File(
+                    checkNotNull(runfiles[trimmedPath]) {
+                        "runfile manifest $mf did not contain path mapping for $rfPath"
+                    }
+                )
+            }.also {
+                check(it.exists()) { "file $it resolved from runfiles did not exist" }
+            }
+        }
+        if(fromManifest != null) {
+            return fromManifest
+        }
+
+        /// if it could not be resolved from the manifest then first try to resolve it directly.
+        val resolvedDirect = File(path.joinToString(File.separator)).takeIf { it.exists() }
+        if(resolvedDirect != null) {
+            return resolvedDirect
+        }
+
+        // Try the java runfiles as the last resort.
+        return javaRunFiles.resolveVerified(path.joinToString(File.separator))
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/io/bazel/kotlin/compiler/BazelK2JVMCompiler.kt b/src/main/kotlin/io/bazel/kotlin/compiler/BazelK2JVMCompiler.kt
index baa7f49..061b962 100644
--- a/src/main/kotlin/io/bazel/kotlin/compiler/BazelK2JVMCompiler.kt
+++ b/src/main/kotlin/io/bazel/kotlin/compiler/BazelK2JVMCompiler.kt
@@ -21,6 +21,7 @@
 import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector
 import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler
 import org.jetbrains.kotlin.config.Services
+import java.io.File
 
 @Suppress("unused")
 class BazelK2JVMCompiler(private val delegate: K2JVMCompiler = K2JVMCompiler()) {
@@ -34,7 +35,7 @@
             // https://github.com/bazelbuild/rules_kotlin/issues/69: remove once jetbrains adds a flag for it.
                 args[i].startsWith("--friend-paths") -> {
                     i++
-                    friendsPaths = args[i].split(":").toTypedArray()
+                    friendsPaths = args[i].split(File.pathSeparator).toTypedArray()
                 }
                 else -> tally += args[i]
             }
diff --git a/src/test/kotlin/io/bazel/kotlin/builder/KotlinBuilderJvmTestTask.java b/src/test/kotlin/io/bazel/kotlin/builder/KotlinBuilderJvmTestTask.java
index de9321c..bc80def 100644
--- a/src/test/kotlin/io/bazel/kotlin/builder/KotlinBuilderJvmTestTask.java
+++ b/src/test/kotlin/io/bazel/kotlin/builder/KotlinBuilderJvmTestTask.java
@@ -60,10 +60,9 @@
     Dep.merge(dependencies)
         .compileJars()
         .forEach(
-            (dependency) -> {
-              assert dependency.toFile().exists();
-              String depString = dependency.toString();
-              taskBuilder.getInputsBuilder().addClasspath(depString);
-            });
+            (dependency) ->
+                taskBuilder
+                    .getInputsBuilder()
+                    .addClasspath(dependency));
   }
 }
diff --git a/src/test/kotlin/io/bazel/kotlin/builder/KotlinBuilderResource.java b/src/test/kotlin/io/bazel/kotlin/builder/KotlinBuilderResource.java
index ab13e04..699104f 100644
--- a/src/test/kotlin/io/bazel/kotlin/builder/KotlinBuilderResource.java
+++ b/src/test/kotlin/io/bazel/kotlin/builder/KotlinBuilderResource.java
@@ -2,6 +2,7 @@
 
 import io.bazel.kotlin.builder.toolchain.CompilationException;
 import io.bazel.kotlin.builder.toolchain.CompilationStatusException;
+import io.bazel.kotlin.builder.utils.BazelRunFiles;
 import io.bazel.kotlin.builder.utils.CompilationTaskContext;
 import io.bazel.kotlin.model.*;
 import org.junit.rules.ExternalResource;
@@ -51,17 +52,17 @@
   public abstract static class Dep {
     private Dep() {}
 
-    abstract Stream<Path> compileJars();
+    abstract Stream<String> compileJars();
 
     private static class Simple extends Dep {
-      private final List<Path> compileJars;
+      private final List<String> compileJars;
 
-      private Simple(List<Path> compileJars) {
+      private Simple(List<String> compileJars) {
         this.compileJars = compileJars;
       }
 
       @Override
-      Stream<Path> compileJars() {
+      Stream<String> compileJars() {
         return compileJars.stream();
       }
     }
@@ -72,16 +73,12 @@
     }
 
     public static List<String> classpathOf(Dep... dependencies) {
-      return merge(dependencies).compileJars().map(Path::toString).collect(Collectors.toList());
+      return merge(dependencies).compileJars().collect(Collectors.toList());
     }
 
     public static Dep simpleOf(String compileJar) {
-      return new Simple(Collections.singletonList(toPlatformPath(compileJar).toAbsolutePath()));
-    }
-
-    @SuppressWarnings("unused")
-    static Dep simpleOf(Path compileJar) {
-      return new Simple(Collections.singletonList(compileJar));
+      return new Simple(
+          Collections.singletonList(BazelRunFiles.resolveVerified(compileJar).getAbsolutePath()));
     }
   }
 
@@ -304,12 +301,17 @@
    * @return a path string suitable for the target platform.
    */
   private static Path toPlatformPath(String path) {
+    assert !path.startsWith("/") : path + " is an absolute path";
     String[] parts = path.split("/");
     return parts.length == 1
         ? Paths.get(parts[0])
         : Paths.get(parts[0], Arrays.copyOfRange(parts, 1, parts.length));
   }
 
+  public final String toPlatform(String path) {
+    return KotlinBuilderResource.toPlatformPath(path).toString();
+  }
+
   @SuppressWarnings("unused")
   private Stream<Path> directoryContents(DirectoryType type) {
     try {
diff --git a/src/test/kotlin/io/bazel/kotlin/builder/tasks/js/KotlinBuilderJsTest.java b/src/test/kotlin/io/bazel/kotlin/builder/tasks/js/KotlinBuilderJsTest.java
index 131a97d..de300cf 100644
--- a/src/test/kotlin/io/bazel/kotlin/builder/tasks/js/KotlinBuilderJsTest.java
+++ b/src/test/kotlin/io/bazel/kotlin/builder/tasks/js/KotlinBuilderJsTest.java
@@ -30,7 +30,8 @@
   public void testJsErrorRendering() {
     ctx.addSource("AClass.kt", "package something", "class AClass{");
     ctx.runFailingCompileTaskAndValidateOutput(
-        this::jsCompilationTask, lines -> assertThat(lines.get(0)).startsWith("sources/AClass.kt"));
+        this::jsCompilationTask,
+        lines -> assertThat(lines.get(0)).startsWith(ctx.toPlatform("sources/AClass.kt")));
   }
 
   private void jsCompilationTask(CompilationTaskContext taskContext, JsCompilationTask task) {
diff --git a/src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/JdepsParserTest.java b/src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/JdepsParserTest.java
index f18a9c0..e3d2759 100644
--- a/src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/JdepsParserTest.java
+++ b/src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/JdepsParserTest.java
@@ -15,67 +15,71 @@
  */
 package io.bazel.kotlin.builder.tasks.jvm;
 
+import com.google.common.truth.Truth;
 import com.google.devtools.build.lib.view.proto.Deps;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
+import java.io.File;
 import java.io.IOException;
 import java.nio.file.Paths;
-import java.util.Arrays;
 import java.util.List;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
-@SuppressWarnings("KotlinInternalInJava")
+@SuppressWarnings({"KotlinInternalInJava", "SpellCheckingInspection"})
 @RunWith(JUnit4.class)
 public class JdepsParserTest {
-  private static final String JDK8_FIXTURE =
-      "alt.jar -> bazel-server-cloud/external/com_github_jetbrains_kotlin/lib/kotlin-stdlib-jdk7.jar\n"
-          + "alt.jar -> bazel-server-cloud/external/com_github_jetbrains_kotlin/lib/kotlin-stdlib.jar\n"
-          + "alt.jar -> bazel-bin/cloud/qa/integrationtests/pkg/extensions/postgres/postgres.jar\n"
-          + "alt.jar -> bazel-server-cloud/bazel-out/darwin-fastbuild/bin/cloud/qa/integrationtests/pkg/alt/alt.runfiles/__main__/external/org_postgresql_postgresql/jar/postgresql-42.1.1.jar\n"
-          + "alt.jar -> /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/jre/lib/rt.jar\n"
-          + "alt.jar -> bazel-bin/cloud/qa/integrationtests/pkg/utils/utils.jar\n"
-          + "   com.axsy.testing.alt (alt.jar)\n"
-          + "      -> com.axsy.testing.extensions.postgres               postgres.jar\n"
-          + "      -> com.axsy.testing.pkg.utils                         utils.jar\n"
-          + "      -> java.io                                            \n"
-          + "      -> java.lang                                          \n"
-          + "      -> java.sql                                           \n"
-          + "      -> javax.sql                                          \n"
-          + "      -> kotlin                                             kotlin-stdlib.jar\n"
-          + "      -> kotlin.jdk7                                        kotlin-stdlib-jdk7.jar\n"
-          + "      -> kotlin.jvm.internal                                kotlin-stdlib.jar\n"
-          + "      -> org.postgresql.ds                                  postgresql-42.1.1.jar\n"
-          + "   com.axsy.testing.alt.sub (alt.jar)\n"
-          + "      -> java.lang                                          \n"
-          + "      -> kotlin                                             kotlin-stdlib.jar\n";
+  private static final List<String> JDK8_FIXTURE =
+      toPlatformPaths(
+          "alt.jar -> bazel-server-cloud/external/com_github_jetbrains_kotlin/lib/kotlin-stdlib-jdk7.jar",
+          "alt.jar -> bazel-server-cloud/external/com_github_jetbrains_kotlin/lib/kotlin-stdlib.jar",
+          "alt.jar -> bazel-bin/cloud/qa/integrationtests/pkg/extensions/postgres/postgres.jar",
+          "alt.jar -> bazel-server-cloud/bazel-out/darwin-fastbuild/bin/cloud/qa/integrationtests/pkg/alt/alt.runfiles/__main__/external/org_postgresql_postgresql/jar/postgresql-42.1.1.jar",
+          "alt.jar -> /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/jre/lib/rt.jar",
+          "alt.jar -> bazel-bin/cloud/qa/integrationtests/pkg/utils/utils.jar",
+          "   com.axsy.testing.alt (alt.jar)",
+          "      -> com.axsy.testing.extensions.postgres               postgres.jar",
+          "      -> com.axsy.testing.pkg.utils                         utils.jar",
+          "      -> java.io                                            ",
+          "      -> java.lang                                          ",
+          "      -> java.sql                                           ",
+          "      -> javax.sql                                          ",
+          "      -> kotlin                                             kotlin-stdlib.jar",
+          "      -> kotlin.jdk7                                        kotlin-stdlib-jdk7.jar",
+          "      -> kotlin.jvm.internal                                kotlin-stdlib.jar",
+          "      -> org.postgresql.ds                                  postgresql-42.1.1.jar",
+          "   com.axsy.testing.alt.sub (alt.jar)",
+          "      -> java.lang                                          ",
+          "      -> kotlin                                             kotlin-stdlib.jar");
 
-  private static final String JDK9_FIXTURE =
-      "alt.jar -> java.base\n"
-          + "alt.jar -> java.sql\n"
-          + "alt.jar -> bazel-server-cloud/external/com_github_jetbrains_kotlin/lib/kotlin-stdlib-jdk7.jar\n"
-          + "alt.jar -> bazel-server-cloud/external/com_github_jetbrains_kotlin/lib/kotlin-stdlib.jar\n"
-          + "alt.jar -> bazel-bin/cloud/qa/integrationtests/pkg/extensions/postgres/postgres.jar\n"
-          + "alt.jar -> bazel-server-cloud/bazel-out/darwin-fastbuild/bin/cloud/qa/integrationtests/pkg/alt/alt.runfiles/__main__/external/org_postgresql_postgresql/jar/postgresql-42.1.1.jar\n"
-          + "alt.jar -> bazel-bin/cloud/qa/integrationtests/pkg/utils/utils.jar\n"
-          + "   com.axsy.testing.alt                               -> com.axsy.testing.extensions.postgres               postgres.jar\n"
-          + "   com.axsy.testing.alt                               -> com.axsy.testing.pkg.utils                         utils.jar\n"
-          + "   com.axsy.testing.alt                               -> java.io                                            java.base\n"
-          + "   com.axsy.testing.alt                               -> java.lang                                          java.base\n"
-          + "   com.axsy.testing.alt                               -> java.sql                                           java.sql\n"
-          + "   com.axsy.testing.alt                               -> javax.sql                                          java.sql\n"
-          + "   com.axsy.testing.alt                               -> kotlin                                             kotlin-stdlib.jar\n"
-          + "   com.axsy.testing.alt                               -> kotlin.jdk7                                        kotlin-stdlib-jdk7.jar\n"
-          + "   com.axsy.testing.alt                               -> kotlin.jvm.internal                                kotlin-stdlib.jar\n"
-          + "   com.axsy.testing.alt                               -> org.postgresql.ds                                  postgresql-42.1.1.jar\n"
-          + "   com.axsy.testing.alt.sub                           -> java.lang                                          java.base\n"
-          + "   com.axsy.testing.alt.sub                           -> kotlin                                             kotlin-stdlib.jar\n";
+  private static final List<String> JDK9_FIXTURE =
+      toPlatformPaths(
+          "alt.jar -> java.base",
+          "alt.jar -> java.sql",
+          "alt.jar -> bazel-server-cloud/external/com_github_jetbrains_kotlin/lib/kotlin-stdlib-jdk7.jar",
+          "alt.jar -> bazel-server-cloud/external/com_github_jetbrains_kotlin/lib/kotlin-stdlib.jar",
+          "alt.jar -> bazel-bin/cloud/qa/integrationtests/pkg/extensions/postgres/postgres.jar",
+          "alt.jar -> bazel-server-cloud/bazel-out/darwin-fastbuild/bin/cloud/qa/integrationtests/pkg/alt/alt.runfiles/__main__/external/org_postgresql_postgresql/jar/postgresql-42.1.1.jar",
+          "alt.jar -> bazel-bin/cloud/qa/integrationtests/pkg/utils/utils.jar",
+          "   com.axsy.testing.alt                               -> com.axsy.testing.extensions.postgres               postgres.jar",
+          "   com.axsy.testing.alt                               -> com.axsy.testing.pkg.utils                         utils.jar",
+          "   com.axsy.testing.alt                               -> java.io                                            java.base",
+          "   com.axsy.testing.alt                               -> java.lang                                          java.base",
+          "   com.axsy.testing.alt                               -> java.sql                                           java.sql",
+          "   com.axsy.testing.alt                               -> javax.sql                                          java.sql",
+          "   com.axsy.testing.alt                               -> kotlin                                             kotlin-stdlib.jar",
+          "   com.axsy.testing.alt                               -> kotlin.jdk7                                        kotlin-stdlib-jdk7.jar",
+          "   com.axsy.testing.alt                               -> kotlin.jvm.internal                                kotlin-stdlib.jar",
+          "   com.axsy.testing.alt                               -> org.postgresql.ds                                  postgresql-42.1.1.jar",
+          "   com.axsy.testing.alt.sub                           -> java.lang                                          java.base",
+          "   com.axsy.testing.alt.sub                           -> kotlin                                             kotlin-stdlib.jar");
 
   private static final List<String> CLASSPATH =
-      Arrays.asList(
+      toPlatformPaths(
           "bazel-bin/cloud/qa/integrationtests/pkg/extensions/postgres/unused.jar",
           "bazel-server-cloud/external/com_github_jetbrains_kotlin/lib/kotlin-stdlib-jdk8.jar",
           "bazel-server-cloud/external/com_github_jetbrains_kotlin/lib/kotlin-stdlib-jdk7.jar",
@@ -85,7 +89,7 @@
           "bazel-bin/cloud/qa/integrationtests/pkg/utils/utils.jar");
 
   private static final String LABEL = "//cloud/qa/integrationtests/pkg/alt";
-  private static final String CLASS_JAR = "bazel-bin/something/alt.jar";
+  private static final String CLASS_JAR = toPlatformPath("bazel-bin/something/alt.jar");
 
   private static final Predicate<String> IS_KOTLIN_IMPLICIT =
       JdepsParser.Companion.pathSuffixMatchingPredicate(
@@ -104,16 +108,20 @@
     testWithFixture(JDK9_FIXTURE);
   }
 
-  private void testWithFixture(String fixture) throws IOException {
+  private static void testWithFixture(List<String> fixture) throws IOException {
     Deps.Dependencies result =
-        JdepsParser.Companion.parse(
-            LABEL,
-            CLASS_JAR,
-            CLASSPATH.stream().collect(Collectors.joining(":")),
-            Arrays.asList(fixture.split("\n")),
-            IS_KOTLIN_IMPLICIT);
+        JdepsParser.Companion.parse(LABEL, CLASS_JAR, CLASSPATH, fixture, IS_KOTLIN_IMPLICIT);
+
     Assert.assertEquals(LABEL, result.getRuleLabel());
 
+    Truth.assertThat(
+            result
+                .getDependencyList()
+                .stream()
+                .map(Deps.Dependency::getPath)
+                .collect(Collectors.toSet()))
+        .containsExactlyElementsIn(CLASSPATH);
+
     Assert.assertEquals(7, result.getDependencyCount());
     Assert.assertEquals(1, depKinds(result, Deps.Dependency.Kind.UNUSED).size());
     Assert.assertEquals(3, depKinds(result, Deps.Dependency.Kind.IMPLICIT).size());
@@ -125,7 +133,16 @@
     System.out.flush();
   }
 
-  private List<Deps.Dependency> depKinds(Deps.Dependencies result, Deps.Dependency.Kind kind) {
+  private static List<String> toPlatformPaths(String... lines) {
+    return Stream.of(lines).map(JdepsParserTest::toPlatformPath).collect(Collectors.toList());
+  }
+
+  // on windows translate absolute paths to c:\ . Also swap the seperators from "/" to "\".
+  private static String toPlatformPath(String it) {
+    return File.separatorChar != '/' ? it.replace(" /", "c:\\").replace("/", File.separator) : it;
+  }
+
+  private static List<Deps.Dependency> depKinds(Deps.Dependencies result, Deps.Dependency.Kind kind) {
     return result
         .getDependencyList()
         .stream()
diff --git a/src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/KotlinBuilderJvmTest.java b/src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/KotlinBuilderJvmTest.java
index 1fbc04e..3fff0e0 100644
--- a/src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/KotlinBuilderJvmTest.java
+++ b/src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/KotlinBuilderJvmTest.java
@@ -158,7 +158,8 @@
   public void testKotlinErrorRendering() {
     ctx.addSource("AClass.kt", "package something;" + "class AClass{");
     ctx.runFailingCompileTaskAndValidateOutput(
-        this::jvmCompilationTask, lines -> assertThat(lines.get(0)).startsWith("sources/AClass"));
+        this::jvmCompilationTask,
+        lines -> assertThat(lines.get(0)).startsWith(ctx.toPlatform("sources/AClass")));
   }
 
   @Test
@@ -167,7 +168,7 @@
     ctx.addSource("AnotherClass.java", "package something;", "", "class AnotherClass{");
     ctx.runFailingCompileTaskAndValidateOutput(
         this::jvmCompilationTask,
-        lines -> assertThat(lines.get(0)).startsWith("sources/AnotherClass"));
+        lines -> assertThat(lines.get(0)).startsWith(ctx.toPlatform("sources/AnotherClass")));
   }
 
   @Test
