Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8130944

JavacFileManager#setLocationFromPaths only works with the default filesystem

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Duplicate
    • Icon: P3 P3
    • 9
    • 9
    • tools
    • None

      From Liam at Google:


      I've been using JavacPathFileManager and an in-memory filesystem (github.com/google/jimfs) for testing some code that uses the compiler API.

      I noticed that JDK-8076420 deleted JavacPathFileManager and moved the Path-based methods into the regular JavacFileManager. I think that's great, but I'm having trouble using the Path-based API in JavacFileManager. The implementation uses Path#toFile(), which only works with the default filesystem.

      Is this a known issue? JDK-8059976 looks like it would probably fix it.

      Repro:

      ===
      import com.google.common.jimfs.Configuration;
      import com.google.common.jimfs.Jimfs;

      import static java.nio.charset.StandardCharsets.UTF_8;

      import com.sun.tools.javac.file.JavacFileManager;
      import com.sun.tools.javac.util.Context;
      import com.sun.tools.javac.util.Log;

      import java.nio.file.FileSystem;
      import java.io.OutputStreamWriter;
      import java.io.PrintWriter;
      import java.io.IOException;
      import java.nio.file.Files;
      import java.nio.file.Path;
      import java.util.Arrays;
      import java.util.Locale;

      import javax.tools.StandardLocation;

      public class Test {
        public static void main(String[] args) throws IOException {
          FileSystem fs = Jimfs.newFileSystem(Configuration.unix());

          Path foo = fs.getPath("/foo");
          Files.createDirectory(foo);
          Path hello = foo.resolve("hello.jar");
          Files.write(hello, Arrays.asList("hello world"), UTF_8);

          Context context = new Context();
          context.put(Log.outKey, new PrintWriter(new OutputStreamWriter(System.err, UTF_8), true));
          JavacFileManager jfm = new JavacFileManager(context, true, UTF_8);

          jfm.setLocationFromPaths(StandardLocation.CLASS_PATH, Arrays.asList(hello));
        }
      }
      ===

      $ javac -cp jimfs.jar:javac.jar Test.java
      $ java -cp jimfs.jar:javac.jar:guava.jar:. Test
      Exception in thread "main" java.lang.UnsupportedOperationException
              at com.google.common.jimfs.JimfsPath.toFile(JimfsPath.java:397)
              at com.sun.tools.javac.file.FSInfo.getJarClassPath(FSInfo.java:69)
              at com.sun.tools.javac.file.Locations$SearchPath.addJarClassPath(Locations.java:321)
              at com.sun.tools.javac.file.Locations$SearchPath.addFile(Locations.java:311)
              at com.sun.tools.javac.file.Locations$SearchPath.addFiles(Locations.java:250)
              at com.sun.tools.javac.file.Locations$SearchPath.addFiles(Locations.java:257)
              at com.sun.tools.javac.file.Locations$SimpleLocationHandler.setLocation(Locations.java:463)
              at com.sun.tools.javac.file.Locations.setLocation(Locations.java:783)
              at com.sun.tools.javac.file.JavacFileManager.setLocationFromPaths(JavacFileManager.java:914)
              at Test.main(Test.java:34)

            jjg Jonathan Gibbons
            jjg Jonathan Gibbons
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: