List<File> (String sdkHome, JavaCompilingTool compilingTool) { // Important! All dependencies must be java 6 compatible (the oldest supported javac to be launched) final Set<File> cp = new LinkedHashSet<>(); cp.add(getResourceFile(ExternalJavacProcess.class)); // self cp.add(getResourceFile(JavacReferenceCollector.class)); // jps-javac-extension library cp.add(getResourceFile(SystemInfoRt.class)); // util_rt for (Class<?> aClass : COMMON_REQUIRED_CLASSES) { cp.add(getResourceFile(aClass)); } try { final Class<?> cmdLineWrapper = Class.forName("com.intellij.rt.execution.CommandLineWrapper"); cp.add(getResourceFile(cmdLineWrapper)); // idea_rt.jar } catch (Throwable th) { LOG.info(th); } try { final String localJavaHome = FileUtilRt.toSystemIndependentName(SystemProperties.getJavaHome()); // sdkHome is not the same as the sdk used to run this process final File candidate = new File(sdkHome, "lib/tools.jar"); if (candidate.exists()) { cp.add(candidate); } else { // last resort final JavaCompiler systemCompiler = ToolProvider.getSystemJavaCompiler(); Class<?> compilerClass; if (systemCompiler != null) { compilerClass = systemCompiler.getClass(); } else { compilerClass = Class.forName("com.sun.tools.javac.api.JavacTool", false, ClasspathBootstrap.class.getClassLoader()); } final File resourceFile = getResourceFile(compilerClass); if (resourceFile != null) { String localJarPath = FileUtilRt.toSystemIndependentName(resourceFile.getPath()); String relPath = FileUtilRt.getRelativePath(localJavaHome, localJarPath, '/'); if (relPath != null) { if (relPath.contains("..")) { relPath = FileUtilRt.getRelativePath(FileUtilRt.toSystemIndependentName(new File(localJavaHome).getParent()), localJarPath, '/'); } if (relPath != null) { final File targetFile = new File(sdkHome, relPath); cp.add(targetFile); // tools.jar } } } } } catch (Throwable th) { LOG.info(th); } cp.addAll(compilingTool.getAdditionalClasspath()); for (JavaSourceTransformer t : JavaSourceTransformer.getTransformers()) { cp.add(getResourceFile(t.getClass())); } return new ArrayList<>(cp); }