diff --git a/src/main/kotlin/com/beust/kobalt/plugin/java/JavaCompiler.kt b/src/main/kotlin/com/beust/kobalt/plugin/java/JavaCompiler.kt index bfc77245..791d7c14 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/java/JavaCompiler.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/java/JavaCompiler.kt @@ -28,32 +28,57 @@ class JavaCompiler @Inject constructor(val jvmCompiler: JvmCompiler) { return TaskResult() } - val allArgs = arrayListOf( - "-d", KFiles.makeDir(info.directory!!, info.outputDir.path).path) - if (info.dependencies.size > 0) { - allArgs.add("-classpath") - allArgs.add(info.dependencies.map { it.jarFile.get() }.joinToString(File.pathSeparator)) - } - allArgs.addAll(info.compilerArgs) - + var command: String + var errorMessage: String val compiler = ToolProvider.getSystemJavaCompiler() - val fileManager = compiler.getStandardFileManager(null, null, null) - val fileObjects = fileManager.getJavaFileObjectsFromFiles(info.sourceFiles.map { File(it) }) - val dc = DiagnosticCollector() - val classes = arrayListOf() - val writer = PrintWriter(System.out) - val task = compiler.getTask(writer, fileManager, dc, allArgs, classes, fileObjects) + val result = + if (compiler != null) { + log(2, "Found system Java compiler, using the compiler API") + val allArgs = arrayListOf( + "-d", KFiles.makeDir(info.directory!!, info.outputDir.path).path) + if (info.dependencies.size > 0) { + allArgs.add("-classpath") + allArgs.add(info.dependencies.map { it.jarFile.get() }.joinToString(File.pathSeparator)) + } + allArgs.addAll(info.compilerArgs) - val command = "javac " + allArgs.joinToString(" ") + " " + info.sourceFiles.joinToString(" ") - log(2, "Launching\n$command") + val fileManager = compiler.getStandardFileManager(null, null, null) + val fileObjects = fileManager.getJavaFileObjectsFromFiles(info.sourceFiles.map { File(it) }) + val dc = DiagnosticCollector() + val classes = arrayListOf() + val writer = PrintWriter(System.out) + val task = compiler.getTask(writer, fileManager, dc, allArgs, classes, fileObjects) - val result = task.call() + command = "javac " + allArgs.joinToString(" ") + " " + info.sourceFiles.joinToString(" ") + log(2, "Launching\n$command") + + val result = task.call() + errorMessage = dc.diagnostics.joinToString("\n") + result + } else { + log(2, "Didn't find system Java compiler, forking javac") + val allArgs = arrayListOf( + executable.absolutePath, + "-d", KFiles.makeDir(info.directory!!, info.outputDir.path).path) + allArgs.addAll(info.sourceFiles) + + val pb = ProcessBuilder(allArgs) + pb.inheritIO() + val line = allArgs.joinToString(" ") + log(1, " Compiling ${info.sourceFiles.size} files") + log(2, " Compiling $line") + + command = allArgs.joinToString(" ") + " " + info.sourceFiles.joinToString(" ") + val process = pb.start() + val errorCode = process.waitFor() + errorMessage = "Something went wrong running javac, need to switch to RunCommand" + errorCode == 0 + } return if (result) { TaskResult(true, "Compilation succeeded") } else { - val message = "Compilation errors, command:\n$command" + - dc.diagnostics.joinToString("\n") + val message = "Compilation errors, command:\n$command" + errorMessage log(1, message) TaskResult(false, message) }