@Test
  public void compileWithEclipse() throws IOException {
    String version = "8";
    File sourceRootFile = new File(SOURCE_ROOT);
    File javaDir = new File(sourceRootFile, "src/main/java");
    File javatestsDir = new File(sourceRootFile, "src/test/java");
    Set<File> sources =
        new ImmutableSet.Builder<File>()
            .addAll(filesUnderDirectory(javaDir, JAVA_FILE))
            .addAll(filesUnderDirectory(javatestsDir, JAVA_FILE))
            .build();
    assertThat(sources).isNotEmpty();
    JavaCompiler compiler = new EclipseCompiler();
    StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
    // This hack is only needed in a Google-internal Java 8 environment where symbolic links make it
    // hard for ecj to find the boot class path. Elsewhere it is unnecessary but harmless. Notably,
    // on Java 9+ there is no rt.jar. There, fileManager.getLocation(PLATFORM_CLASS_PATH) returns
    // null, because the relevant classes are in modules inside
    // fileManager.getLocation(SYSTEM_MODULES).
    File rtJar = new File(JAVA_HOME.value() + "/lib/rt.jar");
    if (rtJar.exists()) {
      List<File> bootClassPath =
          ImmutableList.<File>builder()
              .add(rtJar)
              .addAll(fileManager.getLocation(StandardLocation.PLATFORM_CLASS_PATH))
              .build();
      fileManager.setLocation(StandardLocation.PLATFORM_CLASS_PATH, bootClassPath);
    }
    Iterable<? extends JavaFileObject> sourceFileObjects =
        fileManager.getJavaFileObjectsFromFiles(sources);
    String outputDir = tmp.getRoot().toString();
    ImmutableList<String> options =
        ImmutableList.of(
            "-d",
            outputDir,
            "-s",
            outputDir,
            "-source",
            version,
            "-target",
            version,
            "-warn:-warningToken,-intfAnnotation");
    JavaCompiler.CompilationTask task =
        compiler.getTask(null, fileManager, null, options, null, sourceFileObjects);
    // Explicitly supply an empty list of extensions for AutoValueProcessor, because otherwise this
    // test will pick up a test one and get confused.
    AutoValueProcessor autoValueProcessor = new AutoValueProcessor(ImmutableList.of());
    ImmutableList<? extends Processor> processors =
        ImmutableList.of(
            autoValueProcessor,
            new AutoOneOfProcessor(),
            new AutoAnnotationProcessor(),
            new AutoBuilderProcessor());
    task.setProcessors(processors);
    assertWithMessage("Compilation should succeed").that(task.call()).isTrue();
  }
Tests that we can compile our AutoValue tests using the Eclipse batch compiler. Since the tests
exercise many AutoValue subtleties, the ability to compile them all is a good indication of
Eclipse support.
value/src/it/functional/src/test/java/com/google/auto/value/CompileWithEclipseTest.java