8154837: Class::getPackage with exploded modules when classes in modules defined to the boot loader
Reviewed-by: alanb, chegar
--- a/jdk/src/java.base/share/classes/jdk/internal/loader/BootLoader.java Fri Apr 22 15:05:54 2016 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/loader/BootLoader.java Fri Apr 22 09:43:19 2016 -0700
@@ -30,6 +30,7 @@
import java.lang.reflect.Layer;
import java.lang.reflect.Module;
import java.net.MalformedURLException;
+import java.net.URI;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -184,9 +185,9 @@
/**
* Define the {@code Package} with the given name. The specified
- * location is a jrt URL to a named module in the run-time image, a
- * file path to a module in an exploded run-time image, or the file
- * path to an enty on the boot class path (java agent Boot-Class-Path
+ * location is a jrt URL to a named module in the run-time image,
+ * a file URL to a module in an exploded run-time image, or a file
+ * path to an entry on the boot class path (java agent Boot-Class-Path
* or -Xbootclasspath/a.
*
* <p> If the given location is a JAR file containing a manifest,
@@ -194,7 +195,9 @@
* the manifest, if present.
*
* @param name package name
- * @param location location where the package is (jrt URL or file path)
+ * @param location location where the package is (jrt URL or file URL
+ * for a named module in the run-time or exploded image;
+ * a file path for a package from -Xbootclasspath/a)
*/
static Package definePackage(String name, String location) {
Module module = findModule(location);
@@ -222,9 +225,9 @@
if (location.startsWith("jrt:/")) {
// named module in runtime image ("jrt:/".length() == 5)
mn = location.substring(5, location.length());
- } else {
+ } else if (location.startsWith("file:/")) {
// named module in exploded image
- Path path = Paths.get(location);
+ Path path = Paths.get(URI.create(location));
Path modulesDir = Paths.get(JAVA_HOME, "modules");
if (path.startsWith(modulesDir)) {
mn = path.getFileName().toString();