diff -r 4d8af6fda907 -r defadd528513 src/share/classes/com/sun/tools/jdeps/PlatformClassPath.java --- a/src/share/classes/com/sun/tools/jdeps/PlatformClassPath.java Thu Oct 17 13:50:00 2013 +0200 +++ b/src/share/classes/com/sun/tools/jdeps/PlatformClassPath.java Thu Oct 17 13:19:48 2013 -0700 @@ -24,11 +24,11 @@ */ package com.sun.tools.jdeps; -import java.io.File; import java.io.IOException; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.util.*; @@ -38,45 +38,38 @@ */ class PlatformClassPath { private final static List javaHomeArchives = init(); + static List getArchives() { return javaHomeArchives; } - static boolean contains(Archive archive) { - return javaHomeArchives.contains(archive); + private static List init() { + List result = new ArrayList<>(); + Path home = Paths.get(System.getProperty("java.home")); + try { + if (home.endsWith("jre")) { + // jar files in /jre/lib + result.addAll(addJarFiles(home.resolve("lib"))); + } else if (Files.exists(home.resolve("lib"))) { + // either a JRE or a jdk build image + Path classes = home.resolve("classes"); + if (Files.isDirectory(classes)) { + // jdk build outputdir + result.add(new JDKArchive(classes, ClassFileReader.newInstance(classes))); + } + // add other JAR files + result.addAll(addJarFiles(home.resolve("lib"))); + } else { + throw new RuntimeException("\"" + home + "\" not a JDK home"); + } + return result; + } catch (IOException e) { + throw new Error(e); + } } - private static List init() { - List result = new ArrayList(); - String javaHome = System.getProperty("java.home"); - File jre = new File(javaHome, "jre"); - File lib = new File(javaHome, "lib"); - - try { - if (jre.exists() && jre.isDirectory()) { - result.addAll(addJarFiles(new File(jre, "lib"))); - result.addAll(addJarFiles(lib)); - } else if (lib.exists() && lib.isDirectory()) { - // either a JRE or a jdk build image - File classes = new File(javaHome, "classes"); - if (classes.exists() && classes.isDirectory()) { - // jdk build outputdir - result.add(new Archive(classes, ClassFileReader.newInstance(classes))); - } - // add other JAR files - result.addAll(addJarFiles(lib)); - } else { - throw new RuntimeException("\"" + javaHome + "\" not a JDK home"); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - return result; - } - - private static List addJarFiles(File f) throws IOException { - final List result = new ArrayList(); - final Path root = f.toPath(); + private static List addJarFiles(final Path root) throws IOException { + final List result = new ArrayList<>(); final Path ext = root.resolve("ext"); Files.walkFileTree(root, new SimpleFileVisitor() { @Override @@ -91,17 +84,30 @@ } } @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) + public FileVisitResult visitFile(Path p, BasicFileAttributes attrs) throws IOException { - File f = file.toFile(); - String fn = f.getName(); - if (fn.endsWith(".jar") && !fn.equals("alt-rt.jar")) { - result.add(new Archive(f, ClassFileReader.newInstance(f))); + String fn = p.getFileName().toString(); + if (fn.endsWith(".jar")) { + // JDK may cobundle with JavaFX that doesn't belong to any profile + // Treat jfxrt.jar as regular Archive + result.add(fn.equals("jfxrt.jar") + ? new Archive(p, ClassFileReader.newInstance(p)) + : new JDKArchive(p, ClassFileReader.newInstance(p))); } return FileVisitResult.CONTINUE; } }); return result; } + + /** + * A JDK archive is part of the JDK containing the Java SE API + * or implementation classes (i.e. JDK internal API) + */ + static class JDKArchive extends Archive { + JDKArchive(Path p, ClassFileReader reader) { + super(p, reader); + } + } }